亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

2011-11-2 游標和管道函數

發布時間:2020-08-09 23:39:47 來源:ITPUB博客 閱讀:185 作者:hanaka 欄目:關系型數據庫

http://www.itpub.net/thread-1499223-11-1.html

105樓

我創建了這張表并填入數據:

CREATE TABLE plch_parts
(
   partnum    INTEGER PRIMARY KEY
, partname   VARCHAR2 (100) UNIQUE
)
/
BEGIN
   INSERT INTO plch_parts VALUES (1, 'Mouse');
   INSERT INTO plch_parts VALUES (100, 'Keyboard');
   INSERT INTO plch_parts VALUES (500, 'Monitor');
   COMMIT;
END;
/

我建立了如下的嵌套表類型和包說明:

CREATE OR REPLACE TYPE numbers_t IS TABLE OF NUMBER;
/
CREATE OR REPLACE PACKAGE plch_pipeline
IS
   CURSOR refcur_c
   IS
      SELECT line FROM user_source;
   TYPE refcur_t IS REF CURSOR
      RETURN refcur_c%ROWTYPE;
   FUNCTION double_values (dataset refcur_t)
      RETURN numbers_t
      PIPELINED;
END plch_pipeline;
/

下列的選項中哪些實現了包體,從而使得這個查詢執行之后:

SELECT *
  FROM TABLE (plch_pipeline.double_values (
                CURSOR (SELECT line
                          FROM user_source
                         WHERE name = 'PLCH_PIPELINE'
                           AND type = 'PACKAGE'
                           AND line <= 3
                         ORDER BY line)))
/

這三行會顯示出來:

2
4
6

(A)

CREATE OR REPLACE PACKAGE BODY plch_pipeline
IS
   FUNCTION double_values (dataset refcur_t)
      RETURN numbers_t PIPELINED
   IS
      l_number   NUMBER;
   BEGIN
      LOOP
         FETCH dataset INTO l_number;
         EXIT WHEN dataset%NOTFOUND;
         UPDATE plch_parts SET partnum = partnum;
            
         PIPE ROW (l_number * 2);
      END LOOP;
      CLOSE dataset;
      RETURN;
   END;
END plch_pipeline;
/
SQL> SELECT *
  2    FROM TABLE (plch_pipeline.double_values (
  3                  CURSOR (SELECT line
  4                            FROM user_source
  5                           WHERE name = 'PLCH_PIPELINE'
  6                             AND type = 'PACKAGE'
  7                             AND line <= 3
  8                           ORDER BY line)))
  9  /
SELECT *
  FROM TABLE (plch_pipeline.double_values (
                CURSOR (SELECT line
                          FROM user_source
                         WHERE name = 'PLCH_PIPELINE'
                           AND type = 'PACKAGE'
                           AND line <= 3
                         ORDER BY line)))
ORA-14551: 無法在查詢中執行 DML 操作
ORA-06512: 在 "YOGA.PLCH_PIPELINE", line 12
SQL>

(B)

CREATE OR REPLACE PACKAGE BODY plch_pipeline
IS
   FUNCTION double_values (dataset refcur_t)
      RETURN numbers_t PIPELINED
   IS
      PRAGMA AUTONOMOUS_TRANSACTION;
      l_number   NUMBER;
   BEGIN
      LOOP
         FETCH dataset INTO l_number;
         EXIT WHEN dataset%NOTFOUND;
         UPDATE plch_parts SET partnum = partnum;
         PIPE ROW (l_number * 2);
      END LOOP;
      CLOSE dataset;
      RETURN;
   END;
END plch_pipeline;
/
SQL> SELECT *
  2    FROM TABLE (plch_pipeline.double_values (
  3                  CURSOR (SELECT line
  4                            FROM user_source
  5                           WHERE name = 'PLCH_PIPELINE'
  6                             AND type = 'PACKAGE'
  7                             AND line <= 3
  8                           ORDER BY line)))
  9  /
SELECT *
  FROM TABLE (plch_pipeline.double_values (
                CURSOR (SELECT line
                          FROM user_source
                         WHERE name = 'PLCH_PIPELINE'
                           AND type = 'PACKAGE'
                           AND line <= 3
                         ORDER BY line)))
ORA-06519: 檢測到活動的獨立的事務處理, 已經回退
ORA-06512: 在 "YOGA.PLCH_PIPELINE", line 15
SQL>

(C)

CREATE OR REPLACE PACKAGE BODY plch_pipeline
IS
   FUNCTION double_values (dataset refcur_t)
      RETURN numbers_t PIPELINED
   IS
      PRAGMA AUTONOMOUS_TRANSACTION;
      l_number   NUMBER;
   BEGIN
      LOOP
         FETCH dataset INTO l_number;
         EXIT WHEN dataset%NOTFOUND;
         UPDATE plch_parts SET partnum = partnum;
         PIPE ROW (l_number * 2);
      END LOOP;
      CLOSE dataset;
      COMMIT;
      RETURN;
   END;
END plch_pipeline;
/
SQL> SELECT *
  2    FROM TABLE (plch_pipeline.double_values (
  3                  CURSOR (SELECT line
  4                            FROM user_source
  5                           WHERE name = 'PLCH_PIPELINE'
  6                             AND type = 'PACKAGE'
  7                             AND line <= 3
  8                           ORDER BY line)))
  9  /
SELECT *
  FROM TABLE (plch_pipeline.double_values (
                CURSOR (SELECT line
                          FROM user_source
                         WHERE name = 'PLCH_PIPELINE'
                           AND type = 'PACKAGE'
                           AND line <= 3
                         ORDER BY line)))
ORA-06519: 檢測到活動的獨立的事務處理, 已經回退
ORA-06512: 在 "YOGA.PLCH_PIPELINE", line 15
SQL>

(D)

CREATE OR REPLACE PACKAGE BODY plch_pipeline
IS
   FUNCTION double_values (dataset refcur_t)
      RETURN numbers_t PIPELINED
   IS
      PRAGMA AUTONOMOUS_TRANSACTION;
      l_number   NUMBER;
   BEGIN
      LOOP
         FETCH dataset INTO l_number;
         EXIT WHEN dataset%NOTFOUND;
         UPDATE plch_parts SET partnum = partnum;
         COMMIT;
         
         PIPE ROW (l_number * 2);
      END LOOP;
      CLOSE dataset;
      RETURN;
   END;
END plch_pipeline;
/
SQL> SELECT *
  2    FROM TABLE (plch_pipeline.double_values (
  3                  CURSOR (SELECT line
  4                            FROM user_source
  5                           WHERE name = 'PLCH_PIPELINE'
  6                             AND type = 'PACKAGE'
  7                             AND line <= 3
  8                           ORDER BY line)))
  9  /
COLUMN_VALUE
------------
           2
           4
           6
SQL>

答案說明在109樓

2011-11-2 答案D.
A: 在SQL中調用的函數不能有DML, 除非是自治事務;
B: 雖然用了自治事務,但是在返回之前(PIPE ROW 就是返回一行數據)必須提交或回滾這個事務;
C: 雖然用了自治事務而且有COMMIT, 但是位置不對,COMMIT放在循環外面,這樣在返回(PIPE ROW)之前還是沒有提交。
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

孙吴县| 宜章县| 涞源县| 奈曼旗| 绥德县| 游戏| 大庆市| 广丰县| 沐川县| 水城县| 荥经县| 德庆县| 永靖县| 双辽市| 通许县| 尼玛县| 霍城县| 克山县| 通化县| 昆山市| 二连浩特市| 福鼎市| 西乌珠穆沁旗| 屯昌县| 安达市| 图们市| 法库县| 侯马市| 保山市| 上栗县| 格尔木市| 平塘县| 四子王旗| 福贡县| 含山县| 土默特左旗| 白朗县| 临江市| 和平县| 平定县| 南汇区|