PLSQL Language Referenc-PL/SQL靜態SQL-游標變數-游標變數作為宿主變數

LuiseDalian發表於2014-03-17

游標變數作為宿主變數

宿主變數主要用於在PL/SQL儲存儲存子程式和它的客戶端之間傳遞查詢結果集。當游標變數為宿主變數的時候,PL/SQL和它的客戶(宿主環境)共享儲存查詢結果集的SQL工作區指標。

為了把游標變數作為宿主變數,需要在宿主環境中宣告游標變數,然後把它作為輸入宿主變數(繫結變數)傳遞給PL/SQL。宿主游標變數相容任何返回型別,即是弱型別的。

--游標變數作為Proc*C客戶端程式中的宿主變數

EXEC SQL BEGIN DECLARE SECTION;

    SQL_CURSOR  generic_cv;  -- 宣告宿主游標變數

    int         choice;      -- 選擇

EXEC SQL END DECLARE SECTION;

EXEC SQL ALLOCATE :generic_cv;  -- 初始宿主游標變數

-- 將宿主游標變數傳遞給PL/SQL

/

EXEC SQL EXECUTE

BEGIN

  IF :choice = 1 THEN

    OPEN :generic_cv FOR SELECT * FROM employees;

  ELSIF :choice = 2 THEN

    OPEN :generic_cv FOR SELECT * FROM departments;

  ELSIF :choice = 3 THEN

    OPEN :generic_cv FOR SELECT * FROM jobs;

  END IF;

END;

END-EXEC;

當有任何游標變數指向它的時候,SQL工作區仍然是可訪問的,即使是從一個範圍向另一個範圍。例如上例中,Proc*C程式傳遞宿主游標變數到嵌入的匿名PL/SQL塊中。在塊執行之後,游標變數仍然指向SQL工作區。

如果在客戶端有PL/SQL引擎,則從客戶端呼叫伺服器沒有限制。例如,可以客戶端宣告一個宿主游標變數,然後開啟從伺服器端開啟和獲取它,然後從客戶端開啟和獲取它。也可以通過在PL/SQL匿名塊中的一個往返中開啟和關閉多個宿主游標變數,來降低網路流量。

--在宿主環境中的PL/SQL匿名塊

BEGIN

    OPEN :emp_cv FOR SELECT * FROM employees;

    OPEN :dept_cv FOR SELECT * FROM departments;

    OPEN :loc_cv FOR SELECT * FROM locations;

END;

PL/SQL匿名塊執行之後,游標變數仍然指向SQL工作區,所以客戶端程式可以使用它。當客戶端程式不再需要這些游標變數的時候,可以使用PL/SQL匿名塊來關閉它們。

--宿主環境中的匿名PL/SQL

BEGIN

    CLOSE :emp_cv;

    CLOSE :dept_cv;

    CLOSE :loc_cv;

END;

這個技術對於在Oracle Form中產生多塊窗體非常有用。

BEGIN

    OPEN :c1 FOR SELECT 1 FROM DUAL;

    OPEN :c2 FOR SELECT 1 FROM DUAL;

    OPEN :c3 FOR SELECT 1 FROM DUAL;

END;

注意:如果從OCI客戶端繫結宿主游標變數到PL/SQL,則除非在相同的伺服器呼叫中開啟它,否則不能在伺服器端從它獲取。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17013648/viewspace-1122898/,如需轉載,請註明出處,否則將追究法律責任。

相關文章