我有以下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站点的这个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)
我收到错误:
- 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)
但它不起作用.这个陈述有什么问题?
我有一个包含两个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) 在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) 我试图将传递给DBMS_OUTPUT.PUT_LINE()函数的值打印到SQL Developer中的DBMS_OUTPUT屏幕.无论我传递给函数什么,都不会在输出窗口中打印任何内容.
我打开了DBMS输出窗口,甚至连接了可用的连接.但是在运行以下脚本时,只有"PL/SQL过程成功完成"才会在"脚本输出"窗口中打印,"Dbms输出"窗口中没有任何内容.
此外,我已将缓冲区大小设置为30000,我猜这足以打印字符串'test'.运行命令set serveroutput on也不起作用.
当我在命令提示符下在SQLPlus中尝试相同的脚本时,它工作正常并在打印"PL/SQL过程成功完成"之前打印'test'.
请帮助.谢谢.
我已经使用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)
有人可以建议代码有什么问题吗?
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触发时相同的查询是有效的
选择查询在包过程之外完美地工作,但在内部过程中它会抛出'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) 我想用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) 我以用户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)