如何在Oracle SQL中向动态查询传递输入?
我正在尝试创建一个函数,该函数根据输入动态运行查询。函数的第一个输入input_id是动态查询的参数。第二个输入,在\u QUERY\u ID中,指定要使用的查询如何在Oracle SQL中向动态查询传递输入?,sql,oracle,plsql,Sql,Oracle,Plsql,我正在尝试创建一个函数,该函数根据输入动态运行查询。函数的第一个输入input_id是动态查询的参数。第二个输入,在\u QUERY\u ID中,指定要使用的查询 create or replace FUNCTION getResultID( INPUT_ID NUMBER, IN_QUERY_ID NUMBER ) RETURN VARCHAR2 AS RESULT_ID VARCHAR2(256); query_str VARCHAR2(256);
create or replace
FUNCTION getResultID(
INPUT_ID NUMBER,
IN_QUERY_ID NUMBER
)
RETURN VARCHAR2
AS
RESULT_ID VARCHAR2(256);
query_str VARCHAR2(256);
BEGIN
select CONSTRUCTOR INTO query_str from query_str_ref
where QUERY_ID=IN_QUERY_ID;
EXECUTE IMMEDIATE query_str INTO RESULT_ID USING INPUT_ID;
RETURN Result_ID;
END getResultID;
我得到一个错误,我没有正确地在“RESULT\u ID=IN\u QUERY\u ID;”之后结束语句我想知道我是否遗漏了其他步骤。您没有在函数中声明
Result\u ID
作为变量。您没有在函数中声明Result\u ID
作为变量。好消息是不是您的函数错了。根据@sebas鼓励您生成的dbms\u输出
,您尝试动态执行的字符串是:
select FIRST_NAME||LAST_NAME||to_char(BIRTH_DATE,'yyyy/mm/dd') as HOST_ID FROM INPUT_DATA_TABLE WHERE INPUT_ID=NEW:INPUT_ID;
这有两个问题。NEW:INPUT_ID
导致了ORA-00933
,因为NEW
看起来是假的;如果删除,它将把:INPUT_ID
识别为绑定变量。(NEW
看起来像是来自触发器,但可能是巧合)。您不应该有尾随的在字符串上,execute
不需要它,它将因无效字符错误而中断
因此,如果query\u str\u ref
条目更改为:
select FIRST_NAME||LAST_NAME||to_char(BIRTH_DATE,'yyyy/mm/dd') as HOST_ID FROM INPUT_DATA_TABLE WHERE INPUT_ID=:INPUT_ID
好消息是,不是你的功能出了问题。根据@sebas鼓励您生成的dbms\u输出
,您尝试动态执行的字符串是:
select FIRST_NAME||LAST_NAME||to_char(BIRTH_DATE,'yyyy/mm/dd') as HOST_ID FROM INPUT_DATA_TABLE WHERE INPUT_ID=NEW:INPUT_ID;
这有两个问题。NEW:INPUT_ID
导致了ORA-00933
,因为NEW
看起来是假的;如果删除,它将把:INPUT_ID
识别为绑定变量。(NEW
看起来像是来自触发器,但可能是巧合)。您不应该有尾随的在字符串上,execute
不需要它,它将因无效字符错误而中断
因此,如果query\u str\u ref
条目更改为:
select FIRST_NAME||LAST_NAME||to_char(BIRTH_DATE,'yyyy/mm/dd') as HOST_ID FROM INPUT_DATA_TABLE WHERE INPUT_ID=:INPUT_ID
请,DBMS\u OUTPUT.PUT\u行(输入\u ID)
和DBMS\u输出.PUT\u行(query\u str)代码>Sebas,我将这些输出行放在“where QUERY\u ID=IN\u QUERY\u ID”之后,现在它表明我没有正确地在输出行之后结束语句。它似乎总是在“立即执行”之前找到错误。请对“立即执行”进行注释,以便获得缓冲区输出。您在哪里运行此操作?在SQL*Plus和SQL Developer中,这似乎很好;看起来您使用的任何客户端都不理解execute
命令,这很奇怪。好吧,我以为您在编译函数时遇到了错误,显然不是。这意味着它在您正在执行的动态SQL上出错。请,DBMS\u OUTPUT.PUT\u LINE(INPUT\u ID)
和DBMS\u输出.PUT\u行(query\u str)代码>Sebas,我将这些输出行放在“where QUERY\u ID=IN\u QUERY\u ID”之后,现在它表明我没有正确地在输出行之后结束语句。它似乎总是在“立即执行”之前找到错误。请对“立即执行”进行注释,以便获得缓冲区输出。您在哪里运行此操作?在SQL*Plus和SQL Developer中,这似乎很好;看起来您使用的任何客户端都不理解execute
命令,这很奇怪。好吧,我以为您在编译函数时遇到了错误,显然不是。这意味着你正在执行的动态SQL出错了。对不起…为了清楚起见,我在我的程序中更改了变量的名称。我确实声明了结果id。你知道还有什么问题吗?对不起…为了清楚起见,我在我的程序中更改了变量的名称。我确实申报了结果id。你知道还有什么问题吗?是的!这有帮助!加上将:INPUT\u ID更改为:strINPUT\u ID。是!这有帮助!加上将:INPUT_ID更改为:strINPUT_ID。