smi*_*ilu 3 sql oracle plsql stored-procedures
我有一个SELECT
查询,其中我将有一个动态WHERE
条件。问题是当我尝试将WHERE
条件PARAMETER
与 SQL 查询连接起来时,它不允许我保存PROCEDURE
.
例如:
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;
Run Code Online (Sandbox Code Playgroud)
这就是我的程序的样子。我试过了,EXECUTE IMMEDIETE
但在它的文档中,它写成它不适用于多行查询。
在MSSQL
我们有EXEC
(不确定)可以execute
将文本发送到命令的命令。以同样的方式,我们是否有任何可以运行动态查询的命令Oracle
UPDATE: Answer
Run Code Online (Sandbox Code Playgroud)
我是这样试的。
OPEN OUT_CUR FOR
' SELECT * FROM MYTABLE WHERE TYPE=:QTYPE AND ID ' || DYN_QUERY
USING QTYPE;
Run Code Online (Sandbox Code Playgroud)
它起作用了
该动态字符串必须是“单引号”括起来
OPEN OUT_CUR FOR
'SELECT * FROM MYTABLE WHERE ID '|| DYN_QUERY;
Run Code Online (Sandbox Code Playgroud)
EXECUTE IMMEDIATE
允许多行结果,如果您使用BULK COLLECT
示例:
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;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12641 次 |
最近记录: |