我有点困惑
是否可以在函数/ proc中使用这样的东西?
CURSOR CR IS
SELECT
FROM
WHERE Y = X
以及稍后在正文中,将X值更改为Z或其他内容,然后重新打开游标,使其获取Y = Z的行?
答案 0 :(得分:2)
是的,请尝试这样的事情(快速输入以便语法可能不准确)
sql VARCHAR2(255);
cur REF CURSOR;
val varchar2(100);
val := X;
sql := 'SELECT .. FROM .. WHERE Y = :val';
open cur for
sql
USING val;
close cur;
....
val := Z;
open cur for
sql
USING val;
答案 1 :(得分:2)
有几种方法可以在不使用动态SQL的情况下执行此操作。一种选择是使用参数化游标:
DECLARE
nSome_value NUMBER := 666;
CURSOR CR(parmSome_value NUMBER) IS
SELECT *
FROM SOME_TABLE
WHERE SOME_COLUMN = parmSome_value;
BEGIN
nSome_value := 123; -- change value of nSome_value
OPEN CR(nSome_value); -- pass nSome_value in as the value of the cursor parameter
-- Fetch from the cursor, do whatever
CLOSE CR;
END;
它仍然是静态SQL,但通过将参数传递给游标,可以提高游标的可重用性。
另一种选择是使用游标FOR循环,引用循环SQL中的变量:
DECLARE
nSome_value NUMBER := 666;
BEGIN
nSome_value := 123; -- change value of nSome_value
FOR aRow IN (SELECT *
FROM SOME_TABLE
WHERE SOME_COLUMN = nSome_value)
BEGIN
-- Do something useful with the rows returned by the cursor
END LOOP;
END;
请注意,在这些情况下,您不会更改SQL - 您只是更改查询中使用的变量或参数的值。这些方法的一个优点是,与动态生成的SQL不同,它们不容易受到SQL注入攻击。
分享并享受。
答案 2 :(得分:0)
这也可以通过使用像函数这样的子程序来完成,而不是使用光标
将缩短代码:
创建或替换函数getashish(dept varchar2)将emp3返回为
emp5 emp3:= emp3();
str varchar2(300);
开始
str:='从员工e加入部门中选择emp1(e.last_name,l.city,e.salary)d
on e.department_id = d.department_id连接位置l在d.location_id = l.location_id其中
d.department_name =:dept';
执行立即str 批量收集到emp5 使用dept;
返回emp5; 端;
在这里你必须创建一个对象,包括yoy想要的返回类型,然后创建该对象的表格:
创建或替换类型emp1作为对象(lname varchar2(10),city varchar2(10),sal number(10));
和
创建或替换 输入emp3作为emp1表;