2013-05-06 17 views
1

我正在閱讀一本教授PL/SQL的書,但是就像這個主題上的許多資源一樣,它提供了有關其示例的粗略細節。有人能幫我解決這個問題嗎(從文本中逐字逐句地)?該文本沒有提供使用代碼的示例表。示例pl/sql函數 - 闡述?


下面的代碼創建,將根據給定的僱員編號返回僱員名稱的函數: -

CREATE OR replace FUNCTION Getname (p_empno emp.empno%TYPE) 
RETURN VARCHAR 
IS 
    CURSOR empname_cur(
    p_empno emp.empno%TYPE) IS 
    SELECT ename 
    FROM emp 
    WHERE empno = p_empno; 
    r_empname empname_cur%ROWTYPE; 
BEGIN 

    OPEN empname_cur(p_empno);  
    FETCH empname_cur INTO r_empname; 

    IF empname_cur%NOTFOUND THEN 
     r_empname.ename := 'UNKNOWN EMPLOYEE'; 
    END IF; 

    CLOSE empname_cur; 
    RETURN r_empname.ename; 
END; 

首先,上述函數聲明遊標檢索僱員姓名,光標然後打開,執行提取,如果沒有行被發現,則名稱被設置爲UNKNOWN EMPLOYEE,光標關閉並且名稱返回到調用程序。

該功能可以從SQL語句如下叫: -

SELECT GetName(empno) name 
amount 
FROM bonus; 

所以...... 是什麼在呼喚p_empno?這是表名嗎?它是一個參數的佔位符,其類型與列emno是什麼相同?

這是最令人困惑的我該生產線是

r_empname empname_cur%ROWTYPE; 

這到底是在做什麼?什麼是r_empname?當調用GetName時,那個尾隨的「name」非參數化參數是什麼?

回答

3

它在幹什麼?什麼是r_empname?

PL/SQL允許您根據行,列或遊標的類型定義變量的類型。該行定義了一個名爲r_empname的變量,該變量是與empname_cur遊標返回的行的類型相匹配的記錄類型(例如像行)。

%ROWTYPE語法的優點是,如果更改遊標的SQL查詢,則其餘代碼仍然是強類型的,並且無需其他更改即可編譯。

當調用GetName時,跟隨的「name」參數是什麼?

SQL查詢中額外的name是該函數返回的值的列的別名。如果您運行該查詢,它將顯示在列標題中。

我想你在amount字段之前缺少一個逗號。這大概應該是這樣的:

SELECT GetName (empno) name 
    , amount 
FROM bonus; 
2
  • p_empno在通話,是函數參數的名稱,這將是 的CURSOR參數

    OPEN empname_cur(p_empno); 
    

這句話表示稱爲empname_cur的遊標具有名爲的參數p_empno。在此背景下p_empno從功能參數採用它的值:

FUNCTION GetName 
        (p_empno emp.empno%TYPE) 
  • r_empname是一個變量的名稱,以及empname_cur%ROWTYPE其類型,這意味着可變結構域選自光標 empname_cur行類型採取,在我們的情況下:ename列類型從emp 表。
  • 最後一句:

    SELECT的GetName(EMPNO)名稱 量 FROM獎金;

必須是:

SELECT GetName (empno) name, 
amount 
FROM bonus; 

因此, 「名」 是從結果ALIAS從的GetName功能