2012-03-01 46 views
0
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:語句被忽略動態列名記錄類型可變

我如何分配動態列名記錄類型的變量?

+1

你知道在編譯時WHA記錄字段被命名,爲什麼你不能在你的代碼中使用它們? – 2012-03-01 07:38:43

回答

2

你可以做到這一點與動態SQL:
爲了使例子​​簡單,我會做你的類型TA模式對象(但基本上你沒有 - 你可以把它放在動態部分以及)

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

這個錯誤是因爲record t沒有一個領域cname,但col_name

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

一個必須知道在編譯時記錄的字段。

可以告訴我們你真正要解決的問題是什麼?

+0

謝謝,實際上我也知道記錄t可以與col_name一起使用,但在我的情況下,我從另一個表中獲取列名並檢查具有此列名的記錄值是否爲空。如果您已經看到該cname具有col_name值,該值與記錄列名 – 2012-03-01 06:22:57

+0

t_row.cname相同,但cname本身具有值col_name,這是我的要求將cname動態添加到pl/sql – 2012-03-01 06:25:56