动态列名称以记录类型变量

时间:2012-03-01 06:03:56

标签: plsql oracle10g

 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:忽略语句

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

2 个答案:

答案 0 :(得分:2)

你可以用动态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;

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

答案 1 :(得分:1)

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

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

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

可以告诉我们你要解决的真正问题是什么?