标签: plsql

PL/MySQL存在吗?

在Oracle中有PL/SQL,一种强大的命令式语言.MySQL有什么相似之处吗?

mysql scripting plsql

32
推荐指数
4
解决办法
7万
查看次数

甲骨文:如何在一个范围内"分组"?

如果我有这样的表格:

pkey   age
----   ---
   1     8
   2     5
   3    12
   4    12
   5    22
Run Code Online (Sandbox Code Playgroud)

我可以"分组"来计算每个年龄.

select age,count(*) n from tbl group by age;
age  n
---  -
  5  1
  8  1
 12  2
 22  1
Run Code Online (Sandbox Code Playgroud)

我可以使用什么查询按年龄范围分组?

  age  n
-----  -
 1-10  2
11-20  2
20+    1
Run Code Online (Sandbox Code Playgroud)

我在10gR2上,但我也对任何11g特定的方法感兴趣.

sql oracle plsql oracle10g

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

将数组数组作为输入参数传递给Oracle过程

我正在尝试将一组(varchar)数据传递给Oracle过程.Oracle过程可以从SQL*Plus调用,也可以从另一个PL/SQL过程调用,如下所示:

BEGIN
 pr_perform_task('1','2','3','4');
END;
Run Code Online (Sandbox Code Playgroud)

pr_perform_task 将读取每个输入参数并执行任务.

我不确定如何实现这一目标.我的第一个想法是使用类型的输入参数varray但我得到Error: PLS-00201: identifier 'VARRAY' must be declared错误,当程序定义如下所示:

CREATE OR REPLACE PROCEDURE PR_DELETE_RECORD_VARRAY(P_ID VARRAY) IS

总而言之,如何将数据作为数组传递,让SP循环遍历每个参数并执行任务?

我正在使用Oracle 10gR2作为我的数据库.

oracle plsql stored-procedures

31
推荐指数
2
解决办法
19万
查看次数

ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小

我尝试了以下代码的不同方式,比如取出while或if,但是当我把它们放在一起时(if和while),我总是得到错误...

undefine numero
set serveroutput on
accept numero prompt 'Type # between 100 and 999: '
declare
   i number:=1;
   a char(25);
   b char(1);
   c varchar2(10);
   d number;
begin
   c := №
   d := length(c);
   b := substr(c, i, 1);
   while i <= d loop
     if b = '1' then
       a:= a||'one ';
     end if;
     i := i+1;
   end loop;
   dbms_output.put_line('The number is '||a);
end;
/
Run Code Online (Sandbox Code Playgroud)

错误:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line …
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql if-statement while-loop

31
推荐指数
2
解决办法
41万
查看次数

PL/SQL和SQL中VARCHAR2的最大大小是多少?

我在Oracle 10g上.在一个要求中,我需要增加pl/sql varchar2变量的大小.它已经达到4000尺寸.我已经读过"在PL/SQL中,VARCHAR2可以达到32767字节.对于SQL,限制是4000字节"

我可以在不担心SQL限制的情况下增加此变量的大小吗?

sql oracle plsql varchar2

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

如何在sqlplus中禁止"PL/SQL过程成功完成"消息?

有没有办法让你可以在sqlplus中将SERVEROUTPUT设置为ON,但以某种方式抑制在完成执行plsql过程后自动生成的消息"PL/SQL过程成功完成"?

oracle plsql sqlplus

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

Oracle"ORA-01008:并非所有变量绑定"错误w /参数

这是我第一次处理Oracle,我很难理解为什么我收到这个错误.

我在查询的where子句中使用Oracle的ODT.NET w/C#和以下代码:

WHERE table.Variable1 = :VarA
  AND (:VarB IS NULL OR table.Variable2 LIKE '%' || :VarB || '%')
  AND (:VarC IS NULL OR table.Variable3 LIKE :VarC || '%')
Run Code Online (Sandbox Code Playgroud)

我正在添加参数值,如下所示:

cmd.Parameters.Add("VarA", "24");
cmd.Parameters.Add("VarB", "test");
cmd.Parameters.Add("VarC", "1234");
Run Code Online (Sandbox Code Playgroud)

当我运行此查询时,服务器返回:

ORA-01008: not all variables bound 
Run Code Online (Sandbox Code Playgroud)

如果我注释掉'AND(....'行中的任何一行,则查询成功完成.

如果我只查询两个参数,而不是三个参数,为什么查询会正常运行?我收到的错误甚至没有意义

sql oracle plsql oracle10g

30
推荐指数
2
解决办法
11万
查看次数

从间隔数据类型中提取总秒数

减去timestamps返回值时是interval数据类型.是否有一种优雅的方法可以将此值转换为间隔中的(毫秒/微秒)总数,即整数.

以下可行,但它不是很漂亮:

select abs( extract( second from interval_difference ) 
          + extract( minute from interval_difference ) * 60 
          + extract( hour from interval_difference ) * 60 * 60 
          + extract( day from interval_difference ) * 60 * 60 * 24
            )
  from ( select systimestamp - (systimestamp - 1) as interval_difference
           from dual )
Run Code Online (Sandbox Code Playgroud)

SQL或PL/SQL中是否有更优雅的方法?

sql oracle plsql

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

如果EXISTS条件不适用于PLSQL

我正在尝试在条件为TRUE时打印TEXT.选择代码完美正常.当我只运行选择代码时,它显示403值.但是当条件存在时我必须打印一些文本.以下代码有什么问题.

BEGIN
IF EXISTS(
SELECT CE.S_REGNO FROM
COURSEOFFERING CO
JOIN CO_ENROLMENT CE
  ON CE.CO_ID = CO.CO_ID
WHERE CE.S_REGNO=403 AND CE.COE_COMPLETIONSTATUS = 'C' AND CO.C_ID = 803
)
THEN
    DBMS_OUTPUT.put_line('YES YOU CAN');
END;
Run Code Online (Sandbox Code Playgroud)

这是错误报告:

Error report:
ORA-06550: line 5, column 1:
PLS-00103: Encountered the symbol "JOIN" when expecting one of the following:

   ) , with group having intersect minus start union where
   connect
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql if-statement

30
推荐指数
2
解决办法
11万
查看次数

PL/SQL异常处理:什么都不做(忽略异常)

这是我经常被问到的一个问题.由于我在stackoverflow上找不到任何完全重复,我想我会把它作为参考发布.

问题:在PL/SQL中,我知道如何捕获异常并在捕获它们时执行代码,以及如何将它们传播到调用块.例如,在以下过程中,直接处理NO_DATA_FOUND异常,而所有其他异常都引发到调用块:

CREATE OR REPLACE PROCEDURE MY_PROCEDURE() 
IS
BEGIN
    do_stuff();

EXCEPTION
    WHEN NO_DATA_FOUND THEN
        -- Do something
        handle_exception();

    WHEN OTHERS THEN
        -- Propagate exception
        RAISE;
END;
Run Code Online (Sandbox Code Playgroud)

但是我应该使用什么命令来忽略一个或所有引发的异常并将执行控制返回给调用块?

oracle plsql exception-handling exception

30
推荐指数
2
解决办法
6万
查看次数