[英]PL/SQL Dynamic SQL
I need help. 我需要帮助。 I have a problem in constructing my PL/SQL block.
我在构造PL / SQL块时遇到问题。 In the cursor, I have a query constructed, and i want to insert a filter on cursor.
在游标中,我构造了一个查询,并且我想在游标上插入一个过滤器。 Below is an example:
下面是一个示例:
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';
Can anyone assist me in this construction? 谁能协助我进行这项建设?
You can use a parameterized cursor: 您可以使用参数化的游标:
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;
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;
You can try it like this: 您可以这样尝试:
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' );
Or like this: 或像这样:
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
Here is a simple solution: 这是一个简单的解决方案:
DECLARE code NUMBER; DECLARE代码NUMBER; parameters_amb myOthertable%ROWTYPE;
parameters_amb myOthertable%ROWTYPE;
CURSOR test is SELECT id from mytable where mytable.name = NVL2(parameters_amb.test2, 'NAMETABLE', 'NAMETABLE2'); CURSOR测试是mytable中的SELECT ID,其中mytable.name = NVL2(parameters_amb.test2,'NAMETABLE','NAMETABLE2');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.