【发布时间】:2015-10-01 20:23:29
【问题描述】:
我想使用 pl/sql 函数更新下表,问题是我设法编写了一个触发代码,但我想改用“函数”重写它。 我希望客户 5 将他们的订单从 30 增加到 200。并允许用户输入:
1) customer_ID 的数字 5 和 2) 更新数量为 200。 并打印出客户 5 更新前后的总数量。
Create table sales (customer_ID number(10), product_ID number(10), quantity number(10));
INSERT INTO sales (customer_ID, product_ID, quantity) Values(3,1,23);
INSERT INTO sales (customer_ID, product_ID, quantity) Values(1,2,34);
INSERT INTO sales (customer_ID, product_ID, quantity) Values(1,3,654);
INSERT INTO sales (customer_ID, product_ID, quantity) Values(3,7,32);
INSERT INTO sales (customer_ID, product_ID, quantity) Values(4,3,23);
INSERT INTO sales (customer_ID, product_ID, quantity) Values(3,3,111);
INSERT INTO sales (customer_ID, product_ID, quantity) Values(5,4,6);
我写的触发代码:
create or replace trigger quantity_change
before insert or update of quantity on sales
for each row
WHEN (NEW.customer_id > 0)
DECLARE
qua number;
BEGIN
qua := :NEW.quantity - :OLD.quantity;
dbms_output.put_line('Old quangtity: ' || :OLD.quantity);
dbms_output.put_line('New quantity: ' || :NEW.quantity);
dbms_output.put_line('diiference quangtity: ' || qua);
END;
UPDATE sales
SET quantity = 200 WHERE customer_id = 5;
我设法写了这个程序,但仍然卡住,不知道如何启用使用
CREATE or replace PROCEDURE Updatesales
(
customer_ID number,
product_ID number,
quantity number)
AS
BEGIN
UPDATE sales
SET quantity= 100
WHERE customer_id= 4;
END;
我想用一个函数来解决这个问题,一个函数应该是这样的
CREATE [OR REPLACE] FUNCTION function_name [(parameter_name [IN | OUT | IN OUT] type [, ...])]
RETURN return_datatype {IS | AS} BEGIN < function_body > END [function_name];
请指教
【问题讨论】:
-
为什么?您的要求背后的目的是什么?
-
更多函数知识
-
所以这是一个学习函数的自知练习?首先,如果我是你,我会尝试编写这样的函数。您必须决定需要哪些输入和输出参数,然后考虑如何使用这些参数来查找、更新和返回相关值。如果您遇到困难或有其他问题,请尝试一下,并用您目前所掌握的内容更新您的问题。然后,我们可以为您提供更多有用的建议。
-
oracle 不支持函数中的
DML操作。 -
@jWeaver 如果从 SQL 语句(例如
select或insert)调用函数,则为 true,除非函数声明为pragma autonomous_transaction(尽管我不一定建议这样做)。在 PL/SQL 块中调用的函数可以执行 DML。