我们应该阅读一个文本文件,然后将数据插入表中,同时要注意例外情况。这是我的功能代码:
set serveroutput ON;
CREATE OR replace FUNCTION Order_func(ldir VARCHAR2,
lfile VARCHAR2)
RETURN BOOLEAN
AS
result BOOLEAN;
f utl_file.file_type;
s VARCHAR2(200);
v_row VARCHAR2(2000);
v1 NUMBER;
v2 NUMBER;
v3 NUMBER;
v4 DATE;
v5 DATE;
v6 NUMBER;
v7 NUMBER;
v8 NUMBER;
v9 NUMBER;
customer_error EXCEPTION;
employee_error EXCEPTION;
item_error EXCEPTION;
customerids NUMBER;
employeeids NUMBER;
inventoryids NUMBER;
BEGIN
SELECT cno
INTO customerids
FROM customers;
SELECT employeeno
INTO employeeids
FROM employees;
SELECT itemno
INTO inventoryids
FROM inventory;
f := utl_file.Fopen(ldir, lfile, 'R');
LOOP
utl_file.Get_line(f, v_row);
v1 := Substr(v_row, 1, 4);
v2 := Substr(v_row, 6, 9);
v3 := Substr(v_row, 11, 12);
v4 := Substr(v_row, 15, 23);
v5 := Substr(v_row, 27, 35);
v6 := Substr(v_row, 38, 41);
v7 := Substr(v_row, 43);
v8 := Substr(v_row, 45, 48);
v9 := Substr(v_row, 50, 51);
IF v2 <> customerids THEN --checking customer id
RAISE customer_error;
ELSIF v3 <> employeeids THEN --checking employee id
RAISE employee_error;
ELSIF v6 <> inventoryids THEN --checking item1 id
RAISE item_error;
ELSIF v8 <> inventoryids THEN --checking item2 id
RAISE item_error;
ELSE
INSERT INTO transactions
(tid, orderno, cno, employeeno, received,
shipped, itemno1, quantity1, itemno2, quantity2)
VALUES (sequence_tid.NEXTVAL, v1, v2, v3, v4, v5,
v6, v7, v8, v9);
END IF;
END LOOP;
result := TRUE;
RETURN result;
EXCEPTION
WHEN customer_error THEN
dbms_output.Put_line('Customer not found in parent Customer table'); WHEN
employee_error THEN
dbms_output.Put_line('Employee not found in Employee table');
WHEN item_error THEN
dbms_output.Put_line('Item not found in inventory table'); WHEN OTHERS THEN
dbms_output.Put_line('Error code:'
|| SQLCODE
|| '. Error Message: '
|| SQLERRM);
utl_file.Fclose(f);
result := FALSE;
RETURN result;
END order_func;
这就是我调用该函数的方式(但我认为这是错误的:]]
DECLARE results boolean; BEGIN results := order_func('forQues','items.txt'); DBMS_OUTPUT.PUT_LINE('Result for ORDER_FUNC Function is: ' || results); END;
这是我遇到的错误:
DECLARE results boolean; BEGIN results := order_func('forQues','items.txt'); DBMS_OUTPUT.PUT_LINE('Result for ORDER_FUNC Function is: ' || results); END; Error report - ORA-06550: line 5, column 26: PLS-00306: wrong number or types of arguments in call to '||' ORA-06550: line 5, column 5: PL/SQL: Statement ignored 06550. 00000 - "line %s, column %s:\n%s" *Cause: Usually a PL/SQL compilation error. *Action:
我试图删除dbms_output中的结果,这就是发生的情况:
DECLARE results boolean; BEGIN results := order_func('forQues','items.txt'); DBMS_OUTPUT.PUT_LINE('Result for ORDER_FUNC Function is:'); END;
运行此程序后,我得到了:
Error code:-1422. Error Message: ORA-01422: exact fetch returns more than requested number of rows Result for ORDER_FUNC Function is: PL/SQL procedure successfully completed.
请帮助,如何解决?
我们应该阅读一个文本文件,然后将数据插入表中,同时要注意例外情况。这是我功能的代码:将serveroutput设置为ON;创建或替换功能Order_func(ldir ...
错误ORA-01422: exact fetch returns more than requested number of rows
发生在查询返回多行但您有一个INTO
子句时,该子句只希望返回1行。
除了已经指出的错误之外,您的功能至少有几个问题。我认为最大的问题是您对Substring函数的误解,尤其是对第3个参数的误解。第三个参数可选地表示所需的length