【问题标题】:PL/SQL Dynamic SQLPL/SQL 动态 SQL
【发布时间】:2012-10-09 14:09:56
【问题描述】:
我需要帮助。我在构建 PL/SQL 块时遇到问题。
在游标中,我构造了一个查询,我想在游标上插入一个过滤器。下面是一个例子:
DECLARE
code NUMBER;
parameters_amb myOthertable%ROWTYPE;
CURSOR test is SELECT id from mytable
if parameters_amb.test2 is not null then
where mytable.name = 'NAMETABLE'
else
where mytable.name = 'NAMETABLE2';
任何人都可以帮助我进行这个施工吗?
【问题讨论】:
标签:
oracle
plsql
cursor
conditional
【解决方案1】:
您可以使用参数化光标:
DECLARE
code NUMBER;
parameters_amb myOthertable%ROWTYPE;
param mytable.name%TYPE;
CURSOR test (p_name VARCHAR2) is
SELECT id
FROM mytable
WHERE mytable.name = p_name;
BEGIN
if parameters_amb.test2 is not null then
param := 'NAMETABLE'
else
param := 'NAMETABLE2';
end if;
OPEN test(param);
-- Add code to fetch and read from cursor
END;
【解决方案2】:
你可以这样试试:
DECLARE
code NUMBER;
parameters_amb myOthertable%ROWTYPE;
CURSOR test is SELECT id
from mytable
WHERE (parameters_amb.test2 is not null AND mytable.name = 'NAMETABLE' )
OR (parameters_amb.test2 is null AND mytable.name = 'NAMETABLE2' );
或者像这样:
DECLARE
code NUMBER;
parameters_amb myOthertable%ROWTYPE;
CURSOR test is SELECT id
from mytable
WHERE mytable.name =
CASE WHEN parameters_amb.test2 is not null THEN 'NAMETABLE'
WHEN parameters_amb.test2 is null THEN 'NAMETABLE2' END
【解决方案3】:
DECLARE
stmt varchar2(1000);
code NUMBER;
parameters_amb myOthertable%ROWTYPE;
BEGIN
stmt := 'SELECT id from mytable';
if parameters_amb.test2 is not null
then
stmt := stmt||' where mytable.name = ''NAMETABLE''';
else
stmt := stmt||' where mytable.name = ''NAMETABLE2''';
end if;
OPEN test FOR stmt;
...
...
END;
【解决方案4】:
这是一个简单的解决方案:
声明
代码编号;
参数_amb myOthertable%ROWTYPE;
CURSOR 测试是 SELECT id from mytable
其中 mytable.name = NVL2(parameters_amb.test2, 'NAMETABLE', 'NAMETABLE2');