【问题标题】:Dynamic column name to record type variable记录类型变量的动态列名
【发布时间】:2012-03-01 06:03:56
【问题描述】:
 DECLARE
 TYPE t IS RECORD (
 col_name   VARCHAR2 (100)
 );

  t_row   t;
  cname   VARCHAR (100) := 'col_name';
BEGIN
  t_row.col_name             := 'col';
 DBMS_OUTPUT.put_line ('out');

  IF t_row.cname IS NULL THEN
    DBMS_OUTPUT.put_line ('in');
  END IF;
 END;

第 1 行出错
ORA-06550:第 12 行,第 12 列:
PLS-00302:必须声明组件“CNAME”
ORA-06550:第 12 行,第 3 列:
PL/SQL:语句被忽略

如何将动态列名分配给记录的类型变量?

【问题讨论】:

  • 您在编译时就知道记录字段的名称,为什么不能在代码中使用它们?

标签: plsql oracle10g


【解决方案1】:

您可以使用动态 sql 做到这一点:
为了使示例更简单,我会将您的类型设置为模式对象(但基本上您不必这样做 - 您也可以将其放入动态部分)

create or replace type t is object(col_name varchar2(100));
/

那你可以看看这个脚本:

declare
  t_row t;
  cname varchar2(100) := 'col_name';
begin

  t_row := new t('col');

  execute immediate 'declare t_in t := :0; begin if t_in.' || cname ||
                    ' is null then dbms_output.put_line(''in''); end if; end;'
    using t_row;
end;

虽然,我必须说,这是一个奇怪的要求......

【讨论】:

    【解决方案2】:

    错误是因为record t没有字段cname,但是col_name

    type t is record (
      col_name varchar2(100)
    );
    

    在编译期间必须知道记录字段。

    能否告诉我们您要解决的真正问题是什么?

    【讨论】:

    • 谢谢,实际上我也知道记录 t vairable 应该与 col_name 一起使用,但在我的情况下,我从另一个表中获取列名并检查具有此列名的记录值是否不为空.如果您已经看到 cname 具有 col_name 值,它与记录列名称相同
    • t_row.cname 但 cname 本身具有值 col_name ,这是我将 cname 动态放入 pl/sql 的要求
    猜你喜欢
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多