Pergunta

All,

Eu sou muito novo para procedimentos armazenados, em geral, mas estou lutando especialmente com aqueles em Oracle. Eu criei um exemplo muito simples do que estou tentando realizar e ainda estou recebendo o mesmo erro com esta versão simplificada.

O procedimento de exemplo armazenado é a seguinte:

CREATE OR REPLACE PROCEDURE ashish_test
AUTHID CURRENT_USER IS
BEGIN
     DECLARE
          v_tab     VARCHAR2(50);
          v_strSQL  VARCHAR2(50);
     BEGIN
          v_strSQL := 'SELECT * FROM :1';
          v_tab    := 'ex.emp';
          EXECUTE IMMEDIATE v_strSQL USING v_tab;
     END;
END;

Quando eu chamar a acima procedimento armazenado usando CALL ashish_test(), eu recebo:

Mensagem de erro http://web1.twitpic.com/img /12831839-06a3ea536df5d5a0a839eb83d9e59d25.4a3936b8-scaled.jpg

Com base este artigo (olhar para o Exemplo 7-1), palavra-chave USING deve substituir o espaço reservado numerada (:1) dentro v_strSQL com o valor armazenado no v_tab. No entanto, eu continuo recebendo erro tabela inválido. Eu estou supondo que é porque EXECUTE IMMEDIATE é incapaz de substituir o espaço reservado com o valor por alguma razão, mas eu não tenho certeza por que isso acontece. Alguém sabe se eu estou fazendo algo estúpido aqui?

Eu estou executando isso em banco de dados Oracle 10g e usando PL / SQL Developer.

Foi útil?

Solução

A cláusula USING é apenas para variáveis ??de ligação (ou seja, onde você usaria os nomes das colunas em uma instrução SELECT), não nomes de tabela. uso típico seria algo como isto:

Select col1 from table1 where col2 = :a

Se você quiser usar nomes de tabela variável usar algo como isto:

         v_tab    := 'ex.emp';
         v_strSQL := 'SELECT * FROM ' || v_tab;
         EXECUTE IMMEDIATE v_strSQL;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top