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 游标使用参数作为列名的主要内容,如果未能解决你的问题,请参考以下文章