标签: plsql

oracle函数语法错误

我有以下oracle函数,其中num_list作为逗号分隔列表的输入,然后检查此列表中的数字是否存在于某个表中:

create or replace FUNCTION get_num_exist (num_list varchar2,separator varchar2) 
    RETURN nbs PIPELINED 
as
    row_type nb;
begin

    with numbers as 
    (select regexp_substr(num_list,'[^'||separator||']+', 1, level)num_  
     from dual
     connect by regexp_substr(num_list, '[^'||separator||']+', 1, level) is not null)


    for r_row in (select * from numbers
                  where num_  in (select phone_number 
                                   from phone_numbers) )
    loop
        PIPE ROW(nb(r_row.num_));
    end loop;
    return;

end;
Run Code Online (Sandbox Code Playgroud)

但它在for循环级别给出语法错误.

任何帮助,将不胜感激.

oracle plsql function

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

Oracle PL/SQL - 不是有效月份错误

我正在尝试使用Oracle站点的这个PL/SQL脚本创建日历表: 日期维度数据生成器

一切都很好,但我不能从第5节开始说明:

SELECT *
FROM TABLE(UDF_CALENDAR_GENERATOR(CAST('1-JAN-2016' AS DATE), CAST('31-DEC-2016' AS DATE)));
Run Code Online (Sandbox Code Playgroud)

我收到错误:

  1. 00000 - "不是有效月份"

*原因:
*行动:

我尝试使用to_date函数(基于这个答案):

SELECT *
FROM TABLE(UDF_CALENDAR_GENERATOR(TO_DATE('14-Apr-2015', 'DD-MON-YYYY'), TO_DATE('14-May-2015', 'DD-MON-YYYY')));
Run Code Online (Sandbox Code Playgroud)

但它不起作用.这个陈述有什么问题?

oracle plsql

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

PL/SQL循环表着色为变量

我有一个包含两个columes的表:product(varchar)和用法(varchar).我需要以"product; usage; product; usage ..."格式将表循环到一个变量.如何才能做到这一点?以下循环不起作用:

FOR product IN (SELECT product FROM licence_check) LOOP
    product_usage :=  (licence_check.product || ';' ||  licence_check.usage);
  END LOOP;
Run Code Online (Sandbox Code Playgroud)

oracle plsql loops

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

没有“ PL / SQL过程已成功完成”的SQL Developer DBMS_OUTPUT。

在SQL Developer中,当运行某些PL / SQL时,如果过程完成,则消息“ PL / SQL过程成功完成”。返回。

如果由于某种原因无法通过DBMS_OUTPUT.PUT_LINE无法完成该操作,则运行的PL / SQL可能会向用户返回错误消息,但是,用户还会看到“ PL / SQL过程已成功完成”。 (尤其是在“脚本输出”窗口足够小以至于DBMS_OUTPUT不可见的情况下)。

有什么办法可以使DBMS_OUTPUT返回它应该返回的内容,同时又使脚本不返回“成功完成PL / SQL过程”?

如果没有,我可能不知道SQL Developer中是否有任何替代方法可以向用户提供即时的个性化反馈?

declare 

    testex exception;

begin

    if 1=1 then 
        raise testex;
    end if;

exception when testex then

    dbms_output.put_line('Error msg');

end;
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql oracle-sqldeveloper dbms-output

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

sqldeveloper - DBMS_OUTPUT.PUT_LINE()不起作用

我试图将传递给DBMS_OUTPUT.PUT_LINE()函数的值打印到SQL Developer中的DBMS_OUTPUT屏幕.无论我传递给函数什么,都不会在输出窗口中打印任何内容.

我打开了DBMS输出窗口,甚至连接了可用的连接.但是在运行以下脚本时,只有"PL/SQL过程成功完成"才会在"脚本输出"窗口中打印,"Dbms输出"窗口中没有任何内容.

此外,我已将缓冲区大小设置为30000,我猜这足以打印字符串'test'.运行命令set serveroutput on也不起作用.

无法打印!

当我在命令提示符下在SQLPlus中尝试相同的脚本时,它工作正常并在打印"PL/SQL过程成功完成"之前打印'test'.

请帮助.谢谢.

plsql oracle-sqldeveloper dbms-output

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

PL/SQL无法删除多行

我已经使用PL/SQL编写了简单的代码来删除表中的多行,但是下面的代码只会在每次触发它时删除一行.

DECLARE
    i number(2);
BEGIN
    FOR i IN 1..4 LOOP
        DELETE FROM table_name WHERE rownum = i;
        dbms_output.put_line('i is: '|| i);
    END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

有人可以建议代码有什么问题吗?

oracle plsql oracle11g

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

select from dual和执行直接oracle sql之间的区别

select SUM(ABCD.COUNTRY_CODE) from AB_SRP_DETAILS_ALL ABCD 
where rownum <= 1
Run Code Online (Sandbox Code Playgroud)

当COUNTRY_CODE列是varchar2列时是INVALID,但使用execute immediate触发时相同的查询是有效的

sql oracle plsql

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

查询在存储过程之外工作但在过程内部会引发错误

选择查询在包过程之外完美地工作,但在内部过程中它会抛出'ORA-01858:找到一个非数字字符,其中数字是预期'错误.

这是我的查询:

DECLARE
      v_general_number VARCHAR(11);
BEGIN
      SELECT 'Q' || TO_CHAR(TO_DATE(SYSDATE, 'MM/DD/YYYY'), 'Q') || '/'  ||   LPAD(TO_CHAR(SEQ_EDP_GENERAL_NUM_ID.NEXTVAL), '3', '0')  || '/' || TO_CHAR(EXTRACT(YEAR FROM TO_DATE(SYSDATE, 'MM/DD/YYYY'))) INTO v_general_number FROM DUAL;
      DBMS_OUTPUT.PUT_LINE(v_general_number);
END;
Run Code Online (Sandbox Code Playgroud)

它工作得很好.

但是在存储过程中它会抛出上面的错误.

这是我的程序:

   PROCEDURE save_request(p_name IN requests.suggested_name%TYPE,
                          p_urgency_type IN requests.urgency_type_id%TYPE) 
   AS

      v_general_number VARCHAR(11);

   BEGIN

   SELECT 'Q' || TO_CHAR(TO_DATE(SYSDATE, 'MM/DD/YYYY'), 'Q') || '/'  ||  LPAD(SEQ_EDP_GENERAL_NUM_ID.NEXTVAL, 3, '0')  ||  '/' ||  TO_CHAR(EXTRACT(YEAR FROM TO_DATE(SYSDATE, 'MM/DD/YYYY')))  INTO v_general_number FROM DUAL;

   INSERT INTO requests (suggested_name,
                          urgency_type_id,
                          general_number 
      ) VALUES (
          p_name ,
          p_urgency_type …
Run Code Online (Sandbox Code Playgroud)

oracle plsql

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

oracle ddl trigger:在删除之前创建备份表

我想用ddl触发器(在放置之前)创建一个备份表,并遇到以下问题.

发生第一次丢弃时没关系:a_backup表包含丢弃表的数据.但为什么我不能放弃另一张桌子?

ORA-01031:权限不足



create table b (x number);
Run Code Online (Sandbox Code Playgroud)

- 表B已创建.

create table a (x number);
Run Code Online (Sandbox Code Playgroud)

- 表A已创建.

create table a_backup as select * from a where 1 = 0;
Run Code Online (Sandbox Code Playgroud)

- 表A_BACKUP已创建.

create or replace trigger a_backup_tr
    before drop
    on database
begin
    IF ora_dict_obj_name <> 'A' then
    null;
    ELSIF ora_dict_obj_name = 'A'
    and ora_dict_obj_owner = 'TRANEE' then
    insert into a_backup
    select * from a;
    ELSE null;
    end if;
end;
/
Run Code Online (Sandbox Code Playgroud)

- 触发A_BACKUP_TR编译


-- 1

drop table a;
Run Code Online (Sandbox Code Playgroud)

- 表A下降.


-- 2 …
Run Code Online (Sandbox Code Playgroud)

oracle triggers plsql ddl-trigger

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

在PL/SQL中创建触发抛出编译错误

我以用户ADMIN身份登录并执行PROCEDURE P1来检查和捕获日志.我在创建触发器时遇到错误

PROCEDURE P1
IS
BEGIN
INSERT statement
BEGIN
---
EXCEPTION

WHEN others THEN
  error_mgr.record_error();
 END P1;
Run Code Online (Sandbox Code Playgroud)

AS ADMIN用户没有足够的priveledge我作为另一个用户EXTRACT登录并创建了包error_mgr

create or replace
PACKAGE BODY error_mgr
IS
PROCEDURE record_error
 IS
 PRAGMA AUTONOMOUS_TRANSACTION;
 l_code  INTEGER := SQLCODE;
 l_mesg VARCHAR2(32767) := SQLERRM; 
 BEGIN
 INSERT INTO EXTRACT.error_log 
(created_on,created_by,errorcode,callstack,errorstack,backtrace,error_info) 
 VALUES(SYSDATE,USER,l_code,sys.DBMS_UTILITY.format_call_stack,null,
  sys.DBMS_UTILITY.format_error_backtrace,l_mesg);
        DBMS_OUTPUT.PUT_LINE('ERROR!!');  
COMMIT;
END record_error;
END error_mgr;
Run Code Online (Sandbox Code Playgroud)

注意:EXTRACT也是用户名和架构

提取模式中的ERROR LOG表有一个自动生成列id(LOG_ID)所以在EXTRACT模式中我使用的是序列和触发器

  SEQUENCE:
   CREATE SEQUENCE "EXTRACT"."SEQ_error_log" MINVALUE 1 MAXVALUE 
  9999999999999999999999999999 INCREMENT BY 1 START WITH 335 CACHE 20 NOORDER 
CYCLE ;
Run Code Online (Sandbox Code Playgroud)

触发:

 CREATE TRIGGER EXTRACT.BI_error_log
 BEFORE INSERT …
Run Code Online (Sandbox Code Playgroud)

database oracle triggers plsql packages

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