PL/SQL 游标使用参数作为列名

Posted

技术标签:

【中文标题】PL/SQL 游标使用参数作为列名【英文标题】:PL/SQL Cursor Use Parameter As A Column Name 【发布时间】:2012-05-04 13:17:10 【问题描述】:

我正在使用 PL/SQL。我正在向我的程序发送一些参数。这些参数之一应该是列名。最初它是一个 varchar2,但我想在光标中使用它来引用列名。这怎么可能?

这就是我的代码的样子:

    PROCEDURE proc_name( x IN VARCHAR2, y IN VARCHAR2 ) IS

      cursor csr IS 
       SELECT * 
       FROM table
       SORT BY x y


     BEGIN 
      for y in csr loop 
        ------
      end loop; 

     END proc_name;

过去几天我一直在尝试对此进行研究,但没有成功。我研究了动态 SQL,这是正确的方向吗?似乎对我不起作用。

提前感谢您的帮助

【问题讨论】:

是的,动态 SQL 是答案,但您处于危险的 SQL 注入领域。想象一下,如果有人像 proc_name ('(select salary from emp where ename = ''My Manager'')' 这样调用您的程序 @TonyAndrews - 对谁有危险?每个人都应该知道他们的经理的收入! @Tony Andrews 你能给我举个例子吗?我尝试过的每个人都没有为我工作。 你真的想“从 X 中选择 *”还是“从 mytable 中选择 X”?您的问题是列,但您的示例在 FROM 子句中使用了一个表。 @TonyAndrews 我更新了上面的代码,这样你就可以确切地看到我想要做什么。尝试在给定方向上按给定排序列对表进行排序。所以 x 是列名,y 是 DESC 或 ASC。 【参考方案1】:

试试这个:

PROCEDURE proc_name( x IN VARCHAR2, y IN VARCHAR2 ) IS

  rc sys_refcursor;

  r_table table%rowtype;

 BEGIN 
  open rc for
   'SELECT * 
    FROM table
    ORDER BY ' || x || ' ' || y;
  loop
    fetch rc into r_table;
    exit when rc%notfound;
    ------
  end loop; 
  close rc;

 END proc_name;

【讨论】:

rable 是表。我将您的技术应用到我的程序中并且它有效!非常感谢你。它不仅可以工作,而且我现在对动态 sql 的理解更好一些。再次感谢您。

以上是关于PL/SQL 游标使用参数作为列名的主要内容,如果未能解决你的问题,请参考以下文章

可选参数作为游标中的条件(PL / SQL)

PL SQL 中的游标

oracle PL/SQL编程语言之游标的使用

oracle PL/SQL编程语言之游标的使用

变量作为 Oracle PL/SQL 中 where 子句中的列名

在PL/SQL中使用带参数的游标