如何在Oracle SQL中向动态查询传递输入?

如何在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);

我正在尝试创建一个函数,该函数根据输入动态运行查询。函数的第一个输入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);  
 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。