我正在研究 PL/SQL,它通過使用序列和回圈將值以增量方式插入表中。有 830 行需要插入值。但是,它一直說錯誤 ORA-01422:精確提取在第 11 行回傳的行數超過了請求的行數。導致錯誤的變數型別是日期。并且表行中的所有日期值都應與系統日期相同。我應該修復哪個部分讓它在所有行中插入系統日期?
CREATE SEQUENCE ORDERID_SEQ
START WITH 11080
INCREMENT BY 1
NOCACHE;
DECLARE
LOOPCOUNT NUMBER :=1;
CUSTOMER ORDERS.CUSTOMERID%type;
EMPLOYEE ORDERS.EMPLOYEEID%type;
TERRITORY ORDERS.TERRITORYID%type;
ORDERINGDATE ORDERS.ORDERDATE%type;
BEGIN
LOOP
ORDERINGDATE := SYSDATE;
SELECT ORDERID_SEQ.NEXTVAL INTO CUSTOMER FROM ORDERS;
INSERT INTO ORDERS (CUSTOMERID) VALUES (CUSTOMER);
SELECT ORDERID_SEQ.NEXTVAL INTO EMPLOYEE FROM ORDERS;
INSERT INTO ORDERS (CUSTOMERID) VALUES (EMPLOYEE);
SELECT ORDERID_SEQ.NEXTVAL INTO TERRITORY FROM ORDERS;
INSERT INTO ORDERS (CUSTOMERID) VALUES (TERRITORY);
SELECT ORDERINGDATE INTO ORDERINGDATE FROM ORDERS;
INSERT INTO ORDERS (ORDERDATE) VALUES (ORDERINGDATE);
LOOPCOUNT := LOOPCOUNT 1;
EXIT WHEN LOOPCOUNT >= 830;
END LOOP;
END;
uj5u.com熱心網友回復:
PL/SQL 不允許回傳多行的 SELECT 陳述句(如果需要,必須使用游標)。因為您選擇的是 FROM ORDERS,所以這些陳述句中的每一個都將回傳與 ORDERS 表中當前的行數一樣多的行。而是嘗試:
SELECT ORDERID_SEQ.NEXTVAL INTO CUSTOMER FROM DUAL;
等等。并洗掉最后的 SELECT(ORDERINGDATE)。當您已經為它分配了一個值時,您不需要從資料庫中選擇它。
uj5u.com熱心網友回復:
嗯,你寫的代碼根本沒有意義。
如果要將行插入ORDERS表中,則應一次插入整行。使用與INSERT列一樣多的陳述句將創建一行,其中只有一列帶有值,其余列為空。請注意,只要有一NOT NULL列留空,它就會失敗。
除此之外,select沒有where子句將回傳ORDERS表中的所有行(因此ORA-01422,too_many_rows你得到了)。
為什么將序列值分別選擇到某些列 ( customer, employee, territory) 中orderingdate?您真的應該將序列值放入這些列中嗎?設定orderingdate為sysdate并不意味著您選擇orderingdate(我認為這是orders表中的列名)到具有相同名稱的變數中。
請注意,您不應將變數命名為與表中的列名稱相同的名稱。使用前綴,例如v_orderingdate。
說你要插入830行:為什么是830?您正在選擇ORDERS并插入到ORDERS. 不是說這是不可能的,而是 - 你到底在做什么?而不是回圈,考慮類似于insertSQL(即不是 PL/SQL)級別的單個陳述句(我在猜測列名):
INSERT INTO orders (customerid,
employee,
territory,
orderingdate)
SELECT orderid_seq.NEXTVAL,
employee,
territory,
SYSDATE
FROM some_other_table;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316298.html
