【问题标题】:Can somebody explain dbms_sql.number_table [closed]有人可以解释 dbms_sql.number_table [关闭]
【发布时间】:2014-02-15 14:43:42
【问题描述】:

我试图搜索这个,但无法得到满意的答案,因此在此处发布。有人请解释一下

【问题讨论】:

  • 抱歉,您要问什么?谷歌搜索这个词(第一个链接)给出了一整页的信息? docs.oracle.com/cd/B28359_01/appdev.111/b28419/… --- 这可能也有帮助(如果没有意义,那么是时候出书了)“Oracle 允许您编写使用动态 SQL 的存储过程和匿名 PL/SQL 块。动态 SQL 语句未嵌入在您的源程序中;相反,它们存储在输入到程序或由程序在运行时构建的字符串中。这使您能够创建更通用的过程。"
  • @robnick 我需要一个清晰而漂亮的例子。 :)
  • @AsfakulIslam - 你了解 PL/SQL 集合的基础知识吗? dbms_sql.number_table 只是一个恰好在 dbms_sql 包中定义的集合。它与您可以在自己的包中声明的集合没有什么不同。
  • @JustinCave 是不是只能存号?
  • @AsfakulIslam - 是的,它是数字的集合。更具体地说,是一个关联的数字数组。

标签: plsql oracle11g oracle10g


【解决方案1】:

在了解NUMBER_TABLE之前,最好在一定程度上了解DBMS_SQL本身。
(我这样做是为了我的学习!)

NUMBER_TABLE

其实是,

TYPE number_table IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;

所以,只允许使用数字!

关于 DBMS_SQL 工作原理的流程图! :

您感兴趣的区域在绑定变量框中


--                    | 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.盗版,还有一些评论,来自Oracle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-16
    • 2011-01-08
    • 1970-01-01
    • 2015-10-28
    • 2014-05-18
    • 1970-01-01
    • 2018-05-09
    • 2018-03-19
    相关资源
    最近更新 更多