2010-05-22 100 views
2

返回所有屬性我不知道我怎麼能向選舉子句返回所有屬性PL/SQL如何在ROW

我想是這樣的:

DECLARE 
    v_user USER%ROWTYPE 
BEGIN 
    INSERT INTO User 
    VALUES (1,'Bill','QWERTY') 
    RETURNING * INTO v_user; 
END; 

RETURNING * INTO得到一個錯誤,如何我可以更換*嗎?

+1

備註:在PostgreSQL中可能 - 請參閱http://stackoverflow.com/questions/8820789/oracle-equivalent-of-postgresql-insert-returning – filiprem 2012-01-11 16:18:39

+0

@filiprem:在Postgres中,您甚至不需要程序阻止這一點。它可以用於更方便的普通SQL。 – 2014-01-27 21:25:22

回答

4

這將是整齊的,如果我們可以做這樣的事情,但可惜:

SQL> declare 
    2  v_row t23%rowtype; 
    3 begin 
    4  insert into t23 
    5   values (my_seq.nextval, 'Daisy Head Maisy') 
    6   returning * into v_row; 
    7 end; 
    8/
     returning * into v_row; 
        * 
ERROR at line 6: 
ORA-06550: line 6, column 19: 
PL/SQL: ORA-00936: missing expression 
ORA-06550: line 4, column 5: 
PL/SQL: SQL Statement ignored 


SQL> 

我相信有可能是此功能的記錄變更請求,因爲我知道很多人希望它。但是現在我們所能做的只是每一列的冗長規格:

SQL> declare 
    2  v_row t23%rowtype; 
    3 begin 
    4  insert into t23 
    5   values (my_seq.nextval, 'Daisy Head Maisy') 
    6   returning id, person_name into v_row; 
    7 end; 
    8/

PL/SQL procedure successfully completed. 

SQL> 

壞消息,如果你有很多列!我懷疑原因是,大多數表都有相對較少的派生列(分配給ID的序列,分配給CREATED_DATE的sysdate等),所以大多數值應該已經知道(或至少知道)插入過程。

編輯

我很關心如何返回所有 屬性,無需冗長的每列的 規範;)也許 這是不可能的。

我想我已經說得很清楚,但無論如何:是目前我們沒有使用*或一些類似的非特異性機制的返回子句。

+0

Thx回覆。 我知道你的例子很好,但我很在意如何返回所有的屬性,沒有每列的冗長規範;) 也許這是不可能的。感謝您的時間 – kunkanwan 2010-05-23 10:50:36

+0

文件指出 「returning_clause可以檢索列表達式」 http://download.oracle.com/docs/cd/E11882_01/server.112/e10592/statements_9014.htm#BABJFHEF *(或table_alias。* )特定於SELECT http://download.oracle.com/docs/cd/E11882_01/server.112/e10592/statements_10002.htm#i2080424 – 2010-05-23 23:02:52