所以我有这个大学任务,我必须创建一个名为bill_overdue的触发器.当status = overdue的行插入表invoice时,会在另一个名为message的表中插入一行.
CREATE SEQUENCE AUTOINCREMENTMESSAGE
MINVALUE 100
START WITH 101
INCREMENT BY 1
CACHE 10
;
CREATE OR REPLACE TRIGGER BILL_OVERDUE
BEFORE INSERT ON INVOICE
FOR EACH ROW
WHEN (NEW.STATUS = 'Overdue')
BEGIN
INSERT INTO MESSAGE (MESSAGENO,MESSAGEDATE,ORIGIN,MESSAGE)
VALUES (AUTOINCREMENTMESSAGE.nextval,SYSDATE,USER,:NEW.DATEISSUED,:NEW.INVOICENO,:NEW.CAMPAIGNTITLE);
END;
/
Run Code Online (Sandbox Code Playgroud)
现在,你可以看到我想要添加:new.dateissued,:new.invoiceno并:new.campaigntitle进入一个字段(message).现在我知道我所做的是错的,但我已经尝试在它周围添加括号等,似乎没有什么做我想要的.我如何让它工作?有可能做我想做的事情或我完全错了吗?
我经常得到这个错误(这太烦人了!):
错误报告:ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小ORA-06512:第305行06502. 00000 - "PL/SQL:数字或值错误%s"
示例存储过程循环遍历游标(具有大约10k行),执行某些逻辑,然后使用dbms_output.put_line将每条记录打印到'Script Output'Oracle SQL Developer中的选项卡.
有没有办法清除缓冲区或防止出现此错误(并中止其余的proc)?
如果可以的话,我可以使用它Mod function来清除缓冲区,每10行处理一次.
我有一个程序定义为:
CREATE OR REPLACE PROCEDURE foo (
AS_OF_DATE_IN IN DATE DEFAULT TRUNC(sysdate)-1
) AS ...
Run Code Online (Sandbox Code Playgroud)
哪些可以用这些方式执行:
-- passes '11-NOV-2011'
exec foo('11-NOV-2011');
--set DEFAULT value (yesterday's date)
exec foo();
--makes things more difficult, as default value isn't set
exec foo(NULL);
Run Code Online (Sandbox Code Playgroud)
我想做的是:
AS_OF_DATE_IN:=NVL(AS_OF_DATE_IN, TRUNC(sysdate)-1);
Run Code Online (Sandbox Code Playgroud)
但它会产生重新分配错误.
除了使用NVL()包装AS_OF_DATE_IN的所有用法之外,是否有更有效的方法来处理这种情况?
**编辑**我犯了一个相当愚蠢的错误 - 我正在写一个程序,而不是一个函数.该过程不返回值.
我需要实现的目标是将游标中的所有记录都集成到一个集合中,以使用该游标中的数据填充表.不幸的是,我无法理解如何将数据从光标提取到数组中.我已尝试过批量收集,但没有办法.extend关键字是什么意思?
最后我如何从该阵列获取数据?
我首先声明了所需字段的记录.然后,我创建了一个这种类型的表.然后我批量收集从光标到表格的所有内容.它似乎工作但现在如何从该表中获取数据?
我有两张桌子:
Employee(eid, ename, age..)
Department(deptid, dname, managerid..) //manager id references eid
Run Code Online (Sandbox Code Playgroud)
如何在Department表上创建约束,使经理的年龄始终> 25?
我知道如何在pl sql中创建一个序列.但是,我如何将值设置为3个数字呢?在创建序列时是否有另一个sql语句来执行此操作?
所以一个例子是:
000
001
012
003
Run Code Online (Sandbox Code Playgroud)
多谢你们!
我正在尝试在循环中执行动态选择,但我没有得到任何结果.我想让它像正常选择一样工作.
create or replace type proc_args as varray(20) of varchar2(50);
/
create or replace procedure proc_show_tab(args proc_args)
is
id_kursora integer;
wart integer;
polecenie varchar2(30);
begin
for i in 1..args.count loop
polecenie := 'SELECT * FROM '||args(i);
execute immediate polecenie;
end loop;
end;
/
show error;
declare
args2 proc_args;
begin
args2 := proc_args();
args2.extend(2);
args2(1) := 'osrodek';
args2(2) := 'trasa';
proc_show_tab(args2);
end;
/
Run Code Online (Sandbox Code Playgroud) 我有一个字符串(带空格),我想从中分隔最后一个单词.例如:
"Steve Jobs" => Jobs
"Stack OverFlow Question" => Questions
Run Code Online (Sandbox Code Playgroud)
PL/SQL或SQL中是否有任何功能,以便我能够得到结果Jobs并Question分离出来?
我还在为这个小型零售商店(这个场景,谢天谢地!)工作,我正在尝试用触发器解决这个问题.
相关实体是客户,付款和订单.付款是另外两个之间的链接实体,因此一个客户可以进行多笔付款,一个订单可以有多笔付款(不寻常但仍然可能),这一切都很好.
触发:
CREATE OR REPLACE TRIGGER Check_Payment_Status
BEFORE UPDATE OF Order_Status ON Customer_Order
for each row
DECLARE paymentStatus payment.payment_status%type;
BEGIN
select payment.payment_status into paymentStatus
from payment
where order_no = :new.order_no;
IF (paymentStatus ='Failed' OR paymentStatus IS NULL ) then
RAISE_APPLICATION_ERROR(-20103, 'The full payment has not been made so the order cannot be processed further until then.');
update customer_order set order_status='Delayed' where order_no= :new.order_no;
END IF;
IF (paymentStatus ='Successful' ) then
update payment set payment_date=SYSDATE where order_no= :new.order_no;
END IF; …Run Code Online (Sandbox Code Playgroud) 我收到了我执行的PL/SQL块的以下错误.
ORA-06550:第16行,第1列:PLS-00103:遇到以下某种情况时遇到符号"EXCEPTION":
我在下面的匿名程序工作正常,直到我包括user defined exception e_nonrented.哪个检查bindvariable :g_movie_id=2..If 的值是否是它抛出异常的情况......
以下是代码:
VARIABLE g_movie_id NUMBER EXEC :g_movie_id := 2
DECLARE v_count NUMBER;
v_movieid NUMBER;
v_title mm_movie.movie_title%TYPE;
e_nonrented
EXCEPTION;
BEGIN
SELECT m.movie_title,
COUNT(r.rental_id),
r.movie_id
INTO v_title,
v_count,
v_movieid
FROM mm_movie m,
mm_rental r
WHERE m.movie_id = r.movie_id
AND m.movie_id = :g_movie_id
GROUP BY m.movie_title,
r.movie_id;
DBMS_OUTPUT.PUT_LINE(v_title || ': ' || v_count);
IF :g_movie_id = 2 THEN
RAISE e_nonrented;
EXCEPTION
WHEN no_data_found THEN
DBMS_OUTPUT.PUT_LINE('there is no movie id for: ' || …Run Code Online (Sandbox Code Playgroud)