gpt4 book ai didi

oracle - 按列名动态访问游标

转载 作者:行者123 更新时间:2023-12-04 23:31:12 25 4
gpt4 key购买 nike

我可以动态访问游标的列吗?我是说名字?像这样:

declare
v_cursor := select * from emp;
begin
FOR reg IN v_cursor LOOP
dbms_output.put_line(**reg['column_name_as_string']**);
end loop;
end;

我知道粗体部分 不是 PL/SQL,但我正在寻找类似的东西,但在任何地方都找不到。

谢谢!

最佳答案

您可以使用包 DBMS_SQL 使用动态查询创建和访问游标。

然而,按名称访问列并不是很简单,因为 DBMS_SQL包使用定位,在动态查询中,我们可能不知道执行前列的顺序。

此外,在这个问题的上下文中,似乎我们可能不知道在编译时要显示哪一列,我们假设要显示的列是作为参数给出的。

我们可以使用 DBMS_SQL.describe_columns 分析 SELECT 的列解析后查询以构建列的动态映射。我们假设所有列都可以转换为 VARCHAR2因为我们想用 DBMS_OUTPUT 显示它们.

下面是一个例子:

SQL> CREATE OR REPLACE PROCEDURE display_query_column(p_query VARCHAR2,
2 p_column VARCHAR2) IS
3 l_cursor INTEGER;
4 l_dummy NUMBER;
5 l_description_table dbms_sql.desc_tab3;
6 TYPE column_map_type IS TABLE OF NUMBER INDEX BY VARCHAR2(32767);
7 l_mapping_table column_map_type;
8 l_column_value VARCHAR2(4000);
9 BEGIN
10 l_cursor := dbms_sql.open_cursor;
11 dbms_sql.parse(l_cursor, p_query, dbms_sql.native);
12 -- we build the column mapping
13 dbms_sql.describe_columns3(l_cursor, l_dummy, l_description_table);
14 FOR i IN 1 .. l_description_table.count LOOP
15 l_mapping_table(l_description_table(i).col_name) := i;
16 dbms_sql.define_column(l_cursor, i, l_column_value, 4000);
17 END LOOP;
18 -- main execution loop
19 l_dummy := dbms_sql.execute(l_cursor);
20 LOOP
21 EXIT WHEN dbms_sql.fetch_rows(l_cursor) <= 0;
22 dbms_sql.column_value(l_cursor, l_mapping_table(p_column), l_column_value);
23 dbms_output.put_line(l_column_value);
24 END LOOP;
25 dbms_sql.close_cursor(l_cursor);
26 END;
27 /

Procedure created

我们可以使用仅在运行时已知的查询来调用此过程:
SQL> set serveroutput on
SQL> exec display_query_column('SELECT * FROM scott.emp WHERE rownum < 5', 'ENAME');
SMITH
ALLEN
WARD
JONES

PL/SQL procedure successfully completed

SQL> exec display_query_column('SELECT * FROM scott.emp WHERE rownum < 5', 'EMPNO');
7369
7499
7521
7566

PL/SQL procedure successfully completed

谨慎使用动态 SQL:它与用户具有相同的权限,因此可以执行任何 DML 和 DDL 此架构允许的语句。

例如,上述过程可用于创建或删除表:
SQL> exec display_query_column('CREATE TABLE foo(id number)', '');
begin display_query_column('CREATE TABLE foo(id number)', ''); end;
ORA-01003: aucune instruction analysée
ORA-06512: à "SYS.DBMS_SQL", ligne 1998
ORA-06512: à "APPS.DISPLAY_QUERY_COLUMN", ligne 13
ORA-06512: à ligne 1

SQL> desc foo
Name Type Nullable Default Comments
---- ------ -------- ------- --------
ID NUMBER Y

关于oracle - 按列名动态访问游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4970008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com