2012-02-24 79 views
2

我有一個名爲TABLE1的常規表,其列NUMBER(8)和列varchar2(100)在Oracle PL/SQL中可以這樣做嗎?

現在我創建了一個OBJECT TYPET_MYTYPE具有兩個屬性:一個NUMBER和另一個varchar2

簡而言之,它們是完全一樣的。

現在我想要做以下事情。

v_obj T_MYTYPE; 

begin 
select * into v_obj from TABLE1 t1 where t1.num = 9;--guaranteed to return only ONE row!! 
end; 

PL/SQL:ORA-00947:沒有足夠的值 ..

這是很令人沮喪......我只是想能夠回到ONE行數據的成採集!!無論是記錄還是對象類型!!我不在乎......我似乎無法完成這項工作.. !!!!誰能幫忙?

回答

6

您可以。你只需要使用對象構造

SQL> create type t_simple_emp 
    2  as object 
    3 (
    4 empno number, 
    5 ename varchar2(100) 
    6 ); 
    7/

Type created. 

SQL> declare 
    2 l_simple_emp t_simple_emp; 
    3 begin 
    4 select t_simple_emp(empno, ename) 
    5  into l_simple_emp 
    6  from emp 
    7  where ename = 'KING'; 
    8 end; 
    9/

PL/SQL procedure successfully completed. 

在你的情況,這將是

SELECT t_mytype(column1, column2) 
    INTO v_obj 
    FROM table1 t1 
WHERE t1.num = 9; 

如果你想要做的就是從表中選擇一整行成一個記錄類型,但是,那麼你想要做的ruakh建議,只是聲明瞭一個%ROWTYPE記錄

declare 
    l_emp_rec emp%rowtype; 
begin 
    select * 
    into l_emp_rec 
    from emp 
    where ename = 'KING'; 
end; 
/
+0

我剛剛讀了一本關於PLSQL的完整書,我沒有看到這個......也許我錯過了它......太糟糕了我只能在星期一重新開始工作時才能測試它... – 2012-02-24 21:49:20

+0

想想吧..這是相反的直覺是不是? – 2012-02-24 21:57:30

+0

@FelipeAlmeida - 如果您只想將表中的所有列選擇到記錄中,而不是選擇列的子集或執行任何需要對象類型的任何操作,則ruakh建議聲明「%ROWTYPE」集合將是可取的。 – 2012-02-24 22:38:34

3

取而代之的是:

v_obj T_MYTYPE; 

嘗試這種情況:

v_obj table1%ROWTYPE; 

將其聲明爲具有確切相同類型的table1一行。

+0

但是那麼我不得不使用'table'和'cast'操作數?我避開了使用記錄,因爲我讀過我們只能使用'cast'來創建通過'CREATE TYPE foo ....'創建的類型'..我嘗試在使用OBJECT TYPE之前使用RECORD,但是我無法'SELECT INTO'因爲我剛剛描述的問題。 – 2012-02-24 21:52:22

+0

@FelipeAlmeida:這種方法肯定有優點和缺點。它的一個優點是它是最簡單的方法;另一個是它非常忠實地代表一排桌子。你寫道:「我只是希望能夠將一行數據返回到一個集合中!!不管是記錄還是對象類型!!我都不在乎......「,所以我認爲這些優點會超過你的缺點,如果他們不這樣做,那麼一定不要用這種方法。:-) – ruakh 2012-02-24 22:08:12

+0

我想我已經嘗試了你的方法。我可以不記得了,但我想我遇到了另一個問題......我會在星期一第一件事檢查它,然後再回來說出發生了什麼事。 – 2012-02-24 22:42:21