列名作为 PL/SQL ORACLE 中的变量
Posted
技术标签:
【中文标题】列名作为 PL/SQL ORACLE 中的变量【英文标题】:Column name as variable in PL/SQL ORACLE 【发布时间】:2014-08-07 12:42:25 【问题描述】:我想要一个代码,我将在其中将列名声明为变量,然后使用此变量从某个表中检索所需的列。
DECLARE
col_n VARCHAR (100) := 'X' ;
BEGIN
select col_n from my_table;
END;
Oracle 中最简单、最明确的方法是什么?
【问题讨论】:
这种方式是不可能的。您将不得不使用动态查询。 您可以尝试立即执行,如下所示:***.com/questions/4714163/… 【参考方案1】:您可以使用dynamic sql 来执行您构造为字符串的查询。 它会沿着这些方向发展:
DECLARE
col_n VARCHAR (100) := 'X' ;
plsql_block VARCHAR2(500);
BEGIN
plsql_block := 'select ' || col_n || ' from my_table';
EXECUTE IMMEDIATE plsql_block;
END;
【讨论】:
@zaratustra 因为没有“选择进入”,这是不正确的。 对不起,我没看到,但是没有into
,怎么可能select
?
@zaratustra - SELECT 已执行,但没有返回任何值。另一种方法是执行EXECUTE IMMEDIATE 'select ' || col_n || ' from my_table' INTO SOME_VARIABLE
或EXECUTE IMMEDIATE 'select ' || col_n || ' from my_table' BULK COLLECT INTO SOME_COLLECTION
之类的操作。分享和享受。
有趣的事实,我虽然没有into
子句就无法查询【参考方案2】:
可以使用动态sql:
DECLARE
col_n VARCHAR (100) := 'X' ;
l_cursor sys_refcursor;
l_temp number(10); -- won't work if the col_n column has different type
BEGIN
open l_cursor for 'select '|| col_n ||' from my_table';
loop
fetch l_cursor into l_temp;
exit when l_cursor%NOTFOUND;
...
end loop;
END;
问题是你必须确定你的专栏的类型。
其实还有一种方法可以做到,如果你使用 SQL*Plus 环境的话:
SQL> select &&col_n from employees where &&col_n = 199;
Enter value for col_n: employee_id
old 1: select &&col_n from employees where &&col_n = 199
new 1: select employee_id from employees where employee_id = 199
EMPLOYEE_ID
-----------
199
【讨论】:
我很确定你的意思是在'select
和 from my_table'
之前有一个单引号。
您可以使用包 DBMS_SQL 检索列类型,但是您必须多写几行代码。【参考方案3】:
您将不得不使用动态 sql/query 来实现您想要做的事情。使用EXECUTE IMMEDIATE
如下所示。概念取自Here。
DECLARE col_n VARCHAR(100) := 'X';
DECLARE sql VARCHAR(100);
BEGIN
sql := 'select :p1 from my_table;'
EXECUTE IMMEDIATE sql USING col_n;
END;
SQL *Plus 如下所示
DECLARE col_n VARCHAR(100) := 'X';
DECLARE sql VARCHAR(100);
BEGIN
sql := 'select ' || col_n || ' from my_table;'
EXECUTE IMMEDIATE sql;
END;
【讨论】:
这将导致SELECT 'X' FROM MY_TABLE
,但不会选择列“X”
另外,如上所示参数的使用仅在SQL*Plus中有效,而问题标记为PL/SQL。以上是关于列名作为 PL/SQL ORACLE 中的变量的主要内容,如果未能解决你的问题,请参考以下文章