如何在 PL/SQL CURSOR 中将参数作为输入?

Posted

技术标签:

【中文标题】如何在 PL/SQL CURSOR 中将参数作为输入?【英文标题】:How to give parameter as input in PL/SQL CURSOR? 【发布时间】:2020-06-11 09:58:05 【问题描述】:

我正在尝试执行以下代码。 我将 v_Model_UserName 作为输入。我在 select 语句中使用它。但是在 select 语句中没有输入参数。

SET SERVEROUTPUT ON;
DECLARE
    v_Model_UserName VARCHAR2(30) := UPPER('&Model_UserName');
    v_role VARCHAR2(3000);
    CURSOR v_role1 is
    SELECT granted_role from dba_role_privs where grantee = ('v_Model_UserName') ;
    BEGIN
    OPEN v_role1;
    LOOP
    FETCH v_role1 INTO v_role;
    EXIT WHEN v_role1%NOTFOUND;
    dbms_output.put_line(v_role);
    END LOOP;
    CLOSE v_role1;
    END;
    /

例如。如果我将 &Mode UserName 指定为 HR,它会以 v_Model_UserName = HR 的形式分配给变量。

但是在游标选择语句中还是一样

"SELECT granted_role from dba_role_privs where grantee = 

('v_Model_UserName');"

我希望它是:

"SELECT granted_role from dba_role_privs where grantee = 'HR';"

我也试过给

  SELECT granted_role from dba_role_privs where grantee = v_Model_UserName;

这里仍然没有分配 HR 值。

【问题讨论】:

我的建议是整齐清晰地布置代码。它将更容易理解、维护和调试。例如declarebeginend属于同一层级,循环内容向右缩进一个。 【参考方案1】:

不要引用变量名,因为它只是一个文本字符串'v_Model_UserName':

SELECT granted_role from dba_role_privs where grantee = v_Model_UserName;

(我还删除了多余的括号。它们没有害处,但没有增加任何价值)。

【讨论】:

试过了,但这里仍然没有添加输入。还是一样。 @Kiruthika 您需要使用您现在正在运行的代码更新您的问题,因为我已经根据您当前的问题给出了正确的解决方案!【参考方案2】:

我犯了游标语法错误。 下面的代码有效。

DECLARE
    v_Model_UserName VARCHAR2(30) := UPPER('&Model_UserName');
    v_role VARCHAR2(3000);
    CURSOR v_role1 (var01  Varchar2 )is
    SELECT granted_role from dba_role_privs where grantee = var01;
    BEGIN
    OPEN v_role1 (v_Model_UserName);
    LOOP
    FETCH v_role1 INTO v_role;
    EXIT WHEN v_role1%NOTFOUND;
      dbms_output.put_line(v_role);
    END LOOP;
    CLOSE v_role1;
    END;

【讨论】:

以上是关于如何在 PL/SQL CURSOR 中将参数作为输入?的主要内容,如果未能解决你的问题,请参考以下文章

动态 PL/SQL

PL/SQL 游标 (实验七)

如何在 Oracle PL SQL 中将 INTO 与 SELECT AS 一起使用?

Oracle PL/SQL 传递行类型作为构造函数参数

如何在 pl/sql 中将街道值拆分为原子?

如何在 PL/SQL 中使用 BULK COLLECT 和 FORALL 替换 CURSOR FOR LOOP?