标签: plsql

如何获取PL/SQL关联数组DS的NULL条件检查

我有以下代码片段,我想知道如何检查关联数组中是否存在条目

set serveroutput on;
DECLARE
    TYPE per_form_metric IS record
      (
              output_achieved_itd NUMBER,
              output_achieved_ptd NUMBER
      );
      TYPE per_form_metrics_tbl IS TABLE OF per_form_metric INDEX BY VARCHAR2(10) ;
      TYPE interval_number_tbl IS TABLE OF per_form_metrics_tbl INDEX BY VARCHAR2(10) ;
      TYPE ms_output_tbl IS TABLE OF interval_number_tbl INDEX BY VARCHAR2(100) ;
      g_ms_output_tbl ms_output_tbl ;

      l_per_f_rec        per_form_metric;
      l_per_f_tbl        per_form_metrics_tbl;
      l_per_int_tbl     interval_number_tbl;
      l_ms_out_tbl    ms_output_tbl;

 BEGIN
    l_per_f_rec.output_achieved_itd := 1000;
    l_per_f_rec.output_achieved_ptd := 1000;

    l_per_f_tbl('Period 1') := l_per_f_rec;

    l_per_int_tbl('Interval 1') := l_per_f_tbl;

    l_ms_out_tbl('1') := l_per_int_tbl;

    -- Now get me the output_achieved_itd …
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql

1
推荐指数
1
解决办法
4923
查看次数

是否所有Oracle例外都已命名?

特别是,我一直试图找到ORA-0955的名称来提高代码的可读性.

目前我正在使用以下内容:

EXCEPTION
  WHEN OTHERS THEN
    IF SQLCODE = -00955
Run Code Online (Sandbox Code Playgroud)

我更喜欢的是:

EXCEPTION
  WHEN OBJECT_EXISTS THEN
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎更清洁,我更喜欢这样.但我查看了SYS.STANDARD,它列出了相对较少的命名异常.在线文档似乎反映了SYS.STANDARD中的内容.还有其他包可以查看吗?其他一些资源?

oracle plsql exception

1
推荐指数
1
解决办法
82
查看次数

从过程返回的REF CURSOR获取和批量收集

我有一个具有一个存储过程SYS_REFCURSOR作为一个OUT参数.签名例如如下:

PROCEDURE myProc(p_someID IN INTEGER, p_cursor OUT SYS_REFCURSOR);
Run Code Online (Sandbox Code Playgroud)

我从一个函数调用这个过程,我必须将一个名为clientIDfrom的列复制p_cursor到一个标量嵌套表中.

我这样做:

CREATE OR REPLACE FUNCTION myFunction
    RETURN sys_refcursor
IS
    someID      INTEGER       := 1234;
    myCursor    SYS_REFCURSOR;
    TYPE t_clientID_nt IS TABLE OF NUMBER(16,0);
    clientID_nt t_clientID_nt;
    otherID     SYS_REFCURSOR;
BEGIN
    myProc (someID, myCursor);
    FOR i IN myCursor
    LOOP
        clientID_nt.EXTEND;
        clientID_nt (clientID_nt.COUNT) := i.clientID;
    END LOOP;


    -- Other code that opens the cursor otherID
    -- based on the IDs in clientID_nt
    ...
    ... 
    RETURN otherID;
END;
/
Run Code Online (Sandbox Code Playgroud)

当我尝试编译这个函数时,我得到的错误是: …

oracle plsql cursor oracle11g oracle11gr2

1
推荐指数
1
解决办法
3万
查看次数

可以将PL/SQL可靠地转换为Pig Lating或使用Pig Latin和Hive的Oozie Pipeline

我很想知道用Hadoop替换我的Oracle数据库并了解Hadoop生态系统.

我有很多PL/SQL脚本需要更换,如果我去这条路线.

我的印象是,通过一些努力,我可以将任何PL/SQL脚本转换/翻译成类似的Pig Latin脚本.如果不仅是Pig Latin,那么通过Oozie将Hive和Pig结合起来.

它是否正确?

hadoop plsql hive apache-pig oozie

1
推荐指数
1
解决办法
2337
查看次数

在PL/SQL中反转字符串的过程

我刚开始学习PL/SQL,我不知道如何创建一个过程.逻辑似乎是对的,但我认为第一行有一些语法错误.这是我的代码: -

CREATE OR REPLACE PROCEDURE ReverseOf(input IN varchar2(50)) IS
DECLARE 
        reverse varchar2(50);
BEGIN
        FOR i in reverse 1..length(input) LOOP
                reverse := reverse||''||substr(input, i, 1);
        END LOOP;
        dbms_output.put_line(reverse);
END;
/
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql syntax-error

1
推荐指数
1
解决办法
3万
查看次数

Oracle数据库时态查询实现 - 折叠日期范围

这是我的一个查询的结果:

SURGERY_D
---------
01-APR-05
02-APR-05
03-APR-05
04-APR-05
05-APR-05
06-APR-05
07-APR-05

11-APR-05
12-APR-05
13-APR-05
14-APR-05
15-APR-05
16-APR-05

19-APR-05
20-APR-05
21-APR-05
22-APR-05
23-APR-05
24-APR-05

26-APR-05
27-APR-05
28-APR-05
29-APR-05
30-APR-05
Run Code Online (Sandbox Code Playgroud)

我想将连续的日期范围折叠成间隔.举些例子,

[01-APR-05, 07-APR-05], [11-APR-05, 16-APR-05] and so on.
Run Code Online (Sandbox Code Playgroud)

在时态数据库方面,我想"崩溃"日期.知道如何在Oracle上做到这一点?我正在使用版本11.我搜索它并阅读了一本书,但找不到/理解如何做到这一点.这可能很简单,但每个人都有自己的缺陷,Oracle就是我的.此外,我是新来的,所以如果我违反了任何规则我会道歉.谢谢!

sql oracle plsql temporal-database

1
推荐指数
1
解决办法
320
查看次数

plsql中的递归排列算法

我正在尝试运行一个置换给定字符串的递归过程.它正在sqldeveloper上进行编译但是当我尝试使用输入运行时它给我ora-06502:第13行的数字或值错误(前缀赋值)

create or replace 
  procedure print_anagrams
  (pre in varchar2, str in varchar2)
  is
    prefix varchar2(30);
    stringg varchar2(30);
    strlen number;
  begin
    strlen := length(str);
    if strlen = 0 then
     dbms_output.put_line(pre);
    else
      for i in 1..strlen loop
        prefix := pre || SUBSTR(str,i,1);
        stringg := SUBSTR(str,1,i) || SUBSTR(str,i+1,strlen);
        print_anagrams(prefix,stringg);
      end loop;
    end if;
  end;
Run Code Online (Sandbox Code Playgroud)

sql oracle recursion plsql oracle-sqldeveloper

1
推荐指数
1
解决办法
1471
查看次数

Oracle获得范围数字

这是我的串行表:

+-----------------+-----------------+
|  START_SERIAL   |   END_SERIAL    |
+-----------------+-----------------+
| 120500216057150 | 120500216057155 |
| 120500216057157 | 120500216057157 |
| 120500216057161 | 120500216057164 |
+-----------------+-----------------+
Run Code Online (Sandbox Code Playgroud)

需要得到这样的结果:

120500216057150 
120500216057151 
120500216057152 
120500216057153 
120500216057154 
120500216057155
120500216057157
120500216057161....
Run Code Online (Sandbox Code Playgroud)

请帮我解决这个问题.[似乎需要带有for循环的pl-sql.?]

编辑 亲爱的TechDo,如下pl/sql用法如下.但它给了我一个错误:-)

DECLARE
  start_serial  NUMBER;
  end_serial  NUMBER;
  records NUMBER;
BEGIN
  select start_serial INTO start_serial
    from sales_details ;
  select (start_serial+no_of_cards)as end_serial into end_serial
    from sales_details;
  select count(*) as records into records 
    from sales_details;

  FOR i IN 1..records  LOOP
    INSERT INTO temp (serial_no)
    VALUES(i);
  END LOOP;
END;
/
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql

1
推荐指数
1
解决办法
228
查看次数

Oracle PL/SQL代码中的神秘声明

&nOracle PL/SQL中的这个声明是什么意思?代码示例中的用法(取自此处)如下所示:

DECLARE
    myex EXCEPTION;
    PRAGMA EXCEPTION_INIT(myex,-20015); 
    n NUMBER := &n;
BEGIN
    FOR i IN 1..n LOOP
        dbms_output.put.line(i);
        IF i=n THEN
            RAISE myex;
        END IF;
    END LOOP;
EXCEPTION
    WHEN myex THEN
        dbms_output.put.line('loop is end');
END;
Run Code Online (Sandbox Code Playgroud)

oracle plsql sqlplus

1
推荐指数
1
解决办法
101
查看次数

在多个脚本中定义包规范的元素?

假设我有一个包含mySpec.pks中定义的规范的包

CREATE OR REPLACE PACKAGE TEST_PKG AS 
    PROCEDURE TEST_1 ( asdf int );
    PROCEDURE TEST_2 ( asdf int, asdf2 char );
END;
Run Code Online (Sandbox Code Playgroud)

是否可以将每个过程的实现拆分为多个主体"CREATE OR REPLACE PACKAGE BODY"语句?我正在为身体文件想象这样的东西:

test1.pkb(仅执行过程*TEST_1*)

CREATE OR REPLACE PACKAGE BODY TEST_PKG AS 
    PROCEDURE TEST_1 ( asdf int ) IS
    BEGIN
        --do stuff
    END;
END;
Run Code Online (Sandbox Code Playgroud)

test2.pkb(仅执行过程*TEST_2*)

CREATE OR REPLACE PACKAGE BODY TEST_PKG AS 
    PROCEDURE TEST_2 ( asdf int, asdf2 char ) IS
    BEGIN
        --do stuff
    END;
END;
Run Code Online (Sandbox Code Playgroud)

sql database oracle plsql

1
推荐指数
2
解决办法
976
查看次数