2013-05-13 52 views
0

創建和使用不與存儲在數據庫中的數據交互的pl/sql過程很容易製作和執行,但其用途明顯有限。在Oracle中操作表格

但我在操作這些存儲的數據時遇到了一些困難。

例如與功能:

CREATE OR REPLACE PROCEDURE update_emp (emp_rec CONTACT%ROWTYPE) IS 

    fistname VARCHAR (40); 
    BEGIN 
    firstname := TRIM(fname); 
     UPDATE contact 
     SET FNAME = firstname 
     WHERE CONTACT_ID = emp_rec.id; 
    END update_emp; 
/

其被設計爲在接觸表,該表包括列FNAME和主鍵CONTACT_ID工作;上面的代碼會引發編譯錯誤:

identifier 'FNAME' must be declared

如何獲取有關此列的函數?

+0

您正確使用參數名稱來引用更新語句中的ID列。爲什麼不嘗試對變量賦值做同樣的事情? – APC 2013-05-13 12:58:45

+0

這個怎麼樣'fistname VARCHAR(40);'和'姓:; 「......顯然有限使用」= TRIM(FNAME)'ü失蹤'r'減速 – Shailesh 2013-05-13 13:18:48

+0

爲什麼?我會說完全相反。 – 2013-05-13 22:25:47

回答

2

在這一行:

fistname := TRIM(fname); 

你引用一個變量fname,並且未聲明。

我的猜測是,你真的想使用fname列從傳遞給該過程的記錄:

fistname := TRIM(emp_rec.fname); 
+0

只是想知道:在這種情況下,對象是通過引用傳遞的行嗎? – Stumbler 2013-05-13 13:20:15

+1

@Duncan:你可以這樣描繪,是的。儘管Oracle中的「真實」對象類型與「記錄類型」之間存在細微的差異。 – 2013-05-13 13:30:28

0

從快速瀏覽一下你的代碼,它看起來像錯誤是與線

fistname := TRIM(fname); 

該過程不知道fname是什麼。

0

聲明fistname VARCHAR (40);和更新語句使用SET FNAME = firstname

它應該是一個

SET FNAME = fistname

+0

對不起,錯字 – Stumbler 2013-05-13 13:20:32

+0

我只是顯示你的錯誤。 – Shailesh 2013-05-13 13:23:57

0

真的沒有必要爲firstname變量:

CREATE OR REPLACE PROCEDURE update_emp (emp_rec IN OUT CONTACT%ROWTYPE) IS 
BEGIN 
    UPDATE contact 
    SET FNAME = TRIM(emp_rec.FNAME) 
    WHERE CONTACT_ID = emp_rec.ID; 
END update_emp; 

分享和享受。