[英]Executing Dynamic Sql query in Oracle
I have a SELECT
query in which i will have aa Dynamic WHERE
condition. 我有一个SELECT
查询,其中我将有一个动态WHERE
条件。 The thing is when I try to concatenate the WHERE
condition PARAMETER
with the SQL Query its not allowing me to save the PROCEDURE
. 问题是,当我尝试将WHERE
条件PARAMETER
与SQL查询连接在一起时,它不允许我保存PROCEDURE
。
eg: 例如:
CREATE PROCEDURE usp_MySearchQuery
(
QTYPE IN INT,
OUT_CUR OUT SYS_REFCURSOR
)
IS
DYN_QUERY VARCHAR2;
BEGIN
IF QTYPE=1 THEN
DYN_QUERY :=' BETWEEN 1 AND 2';
ELSE
DYN_QUERY :='=10';
END IF;
OPEN OUT_CUR FOR
SELECT * FROM MYTABLE WHERE TYPE=QTYPE AND ID || DYN_QUERY;
END;
This is how my procedure looks like. 这是我的程序的样子。 I tried EXECUTE IMMEDIETE
but in its documentation itself, its written it wont work for multiple row query. 我尝试了EXECUTE IMMEDIETE
但是在它的文档本身中,它不能用于多行查询。
In MSSQL
we have EXEC
(not sure) command which can execute
the text sent to the command. 在MSSQL
我们具有EXEC
(不确定)命令,该命令可以execute
发送给该命令的文本。 In the same way do we have any commands which can run the dynamic query in Oracle
同样,我们是否具有可以在Oracle
运行动态查询的任何命令
UPDATE: Answer
I tried like this. 我尝试过这样。
OPEN OUT_CUR FOR
' SELECT * FROM MYTABLE WHERE TYPE=:QTYPE AND ID ' || DYN_QUERY
USING QTYPE;
and it worked 而且有效
The Dynamic String has to be enclosed within 'Single Quotes' 动态字符串必须包含在“单引号”内
OPEN OUT_CUR FOR
'SELECT * FROM MYTABLE WHERE ID '|| DYN_QUERY;
EXECUTE IMMEDIATE
allows Multi row result, if you use BULK COLLECT
如果您使用BULK COLLECT
,则EXECUTE IMMEDIATE
允许多行结果
Example: 例:
DECLARE
TYPE myarray IS TABLE OF VARCHAR2(100);
v_array myarray;
BEGIN
EXECUTE IMMEDIATE 'select ''x'' from dual union all select ''y'' from dual'
BULK COLLECT INTO v_array;
--Or you could use the alternative quoting mechanism to avoid doubling quotation marks.
--EXECUTE IMMEDIATE q'[select 'x' from dual union all select 'y' from dual]'
-- BULK COLLECT INTO v_array;
FOR i IN 1..v_array.count
LOOP
DBMS_OUTPUT.PUT_LINE(v_array(i));
END LOOP;
END;
EXECUTE IMMEDIATE
using bind variables ; 使用绑定变量 EXECUTE IMMEDIATE
;
String := 'SELECT * FROM EMP WHERE name = :name AND age = :age AND :name <> ''Mahesh''';
EXECUTE IMMEDIATE String USING 'Mahi',21,'Mahi';
<OR>
EXECUTE IMMEDIATE String USING proc_variable1,proc_variable2,proc_variable1;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.