有人可以解释dbms_sql.number_table

时间:2014-01-24 14:44:28

标签: plsql oracle11g oracle10g

我试图搜索这个,但无法得到满意的答案,因此在这里张贴。有人请解释

1 个答案:

答案 0 :(得分:0)

在理解DBMS_SQL之前,最好在某种程度上理解NUMBER_TABLE
(我这是为我的学习!)

NUMBER_TABLE

实际上是

TYPE number_table IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;

所以,只允许数字!

关于DBMS_SQL如何工作的FlowChart! :

您感兴趣的区域是绑定变量


--                    | open_cursor |
--                      -----------
--                           |
--                           |
--                           v
--                         -----
--          ------------>| parse |
--          |              -----
--          |                |
--          |                | ---------
--          |                v          |
--          |           --------------  |
--          |-------->| bind_variable | |
--          |     ^     -------------   |
--          |     |           |         |
--          |      -----------|         |
--          |                 |<--------
--          |                 v
--          |               query?---------- yes ---------
--          |                 |                           |
--          |                no                           |
--          |                 |                           |
--          |                 v                           v
--          |              -------                  -------------
--          |----------->| execute |            ->| define_column |
--          |              -------             |    -------------
--          |                 |------------    |          |
--          |                 |            |    ----------|
--          |                 v            |              v
--          |           --------------     |           -------
--          |       ->| variable_value |   |  ------>| execute |
--          |      |    --------------     | |         -------
--          |      |          |            | |            |
--          |       ----------|            | |            |
--          |                 |            | |            v
--          |                 |            | |        ----------
--          |                 |<-----------  |----->| fetch_rows |
--          |                 |              |        ----------
--          |                 |              |            |
--          |                 |              |            v
--          |                 |              |  -----------------
--          |                 |              | | column_value    |
--          |                 |              | | variable_value  |
--          |                 |              |  -----------------
--          |                 |              |            |
--          |                 |<--------------------------
--          |                 |
--           -----------------|
--                            |
--                            v
--                       ------------
--                     | close_cursor |
--      

             ------------

示例: 例如,在DELETE语句中,您可以绑定WHERE子句中的数组,并为数组中的每个元素运行语句:

DECLARE
  stmt VARCHAR2(200);
  dept_no_array DBMS_SQL.NUMBER_TABLE;
  c NUMBER;
  dummy NUMBER;
begin
  dept_no_array(1) := 10; dept_no_array(2) := 20; /* Put some values into the array */
  dept_no_array(3) := 30; dept_no_array(4) := 40;
  dept_no_array(5) := 30; dept_no_array(6) := 40;
  stmt := 'delete from emp where deptno = :dept_array'; /* A Dynamic SQL String with a bind variable */
  c := DBMS_SQL.OPEN_CURSOR; /* Open a Cursor! */
  DBMS_SQL.PARSE(c, stmt, DBMS_SQL.NATIVE); /* Parse the Dynamic SQL , making it happen on the native database to which is connected! */

  DBMS_SQL.BIND_ARRAY(c, ':dept_array', dept_no_array, 1, 4);
  /* Bind only elements 1 through 4 to the cursor Happens 4 times */

  dummy := DBMS_SQL.EXECUTE(c);
  /* Execute the Query, and return number of rows deleted! */

  DBMS_SQL.CLOSE_CURSOR(c); 

  EXCEPTION WHEN OTHERS THEN
    IF DBMS_SQL.IS_OPEN(c) THEN
      DBMS_SQL.CLOSE_CURSOR(c);
    END IF;
    RAISE;
END;
/ 

P.S。 rip-off ,还有更多来自Oracle

的提交