EXECUTAR imediato com USANDO erros cláusula que
-
06-07-2019 - |
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:
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.
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;