簡體   English   中英

使用存儲過程插入表中

[英]Insert into a table using a stored procedure

我有這個簡單的存儲過程,它會在我的Orders表中添加一列

create or replace PROCEDURE ADD_ORDER 
(
  CUSTOMER_ID IN NUMBER 
, NEW_ORDER_ID OUT NUMBER 
) AS 
DECLARE
  NEW_ORDER_ID := MAX(ORDERS.ORDER_NO) + 1;
BEGIN
  INSERT INTO ORDERS(ORDER_NO, REP_NO, CUST_NO, ORDER_DT, STATUS)
  VALUES( NEW_ORDER_ID, 36, CUSTOMER_ID, CURDATE(), 'C')
END ADD_ORDER;

這是說聲明部分不在正確的位置(我認為),也不應該在那里結束。 這是錯誤屏幕上的內容:

錯誤(6,1):PLS-00103:在預期以下情況之一時遇到符號“DECLARE”:
begin function pragma procedure subtype type current cursor 刪除存在先前的外部語言 在“DECLARE”之前插入符號“begin”以繼續。

錯誤(11,1):PLS-00103:在預期以下之一時遇到符號“END”:,; 返回 返回

誰能告訴我這里出了什么問題?

正如已經提到的,select 的最大訂單號然后使用它來插入一行是一個壞主意。 如果兩個進程同時執行此操作,它們會嘗試插入具有相同訂單號的行。

更好地使用 Oracle 的內置特性SEQUENCEIDENTITY

以下是創建表的方法:

CREATE TABLE orders 
(
  order_no  NUMBER(8) GENERATED ALWAYS AS IDENTITY,
  rep_no    NUMBER(3)    DEFAULT 36       NOT NULL,
  cust_no   NUMBER(8)                     NOT NULL,
  order_dt  DATE         DEFAULT SYSDATE  NOT NULL,
  status    VARCHAR2(1)  DEFAULT 'C'      NOT NULL
);

這就是您的程序的樣子:

CREATE OR REPLACE PROCEDURE add_order 
(
  in_cust_no   IN  NUMBER,
  out_order_no OUT NUMBER 
) AS
BEGIN
  INSERT INTO ORDERS(cust_no) VALUES (in_cust_no)
    RETURNING order_no INTO out_order_no;
END add_order;

演示: https://dbfiddle.uk/?rdbms=oracle_18&fiddle=4b49723c15eb810c01077286e171bc95

您的代碼中存在語法錯誤。

 NEW_ORDER_ID := MAX(ORDERS.ORDER_NO) + 1; --not be used liked it.

使用下面的代碼

create or replace PROCEDURE ADD_ORDER 
(
  CUSTOMER_ID IN NUMBER 
, NEW_ORDER_ID OUT NUMBER 
) AS 

  V_NEW_ORDER_ID NUMBER;
BEGIN
    SELECT NVL(MAX(ORDER_NO),0)+1 INTO V_NEW_ORDER_ID FROM ORDERS;
    
    INSERT INTO ORDERS(ORDER_NO, REP_NO, CUST_NO, ORDER_DT, STATUS)
    VALUES( V_NEW_ORDER_ID, 36, CUSTOMER_ID, CURDATE(), 'C');
    
    NEW_ORDER_ID:=V_NEW_ORDER_ID;
   
    /* 
        * CURDATE() -> I am assuming it is user defined function. You can also use SYSDATE, CURRENT_DATE istead of CURDATE()
        * OUT Parameter is a write-only parameter. You cannot read value from OUT Parameter
    */
    
END ADD_ORDER;

很少有事情需要是正確的。

如果您希望編寫PROCEDUREFUNCTION ,則不必使用DECLARE關鍵字。 在編寫測試腳本或其他東西時,您應該使用DECLARE關鍵字來聲明變量。 在編寫程序時,

  1. 所有參數都應該在括號內。
  2. 變量應該在ASBEGIN關鍵字之間定義,並且應該給出數據類型。

如果您需要獲取 ORDERS TAB 的最大數量,您必須為此編寫一個 SQL 查詢。 因為MAX function 只能在SQL內部使用。 此外,如果您有興趣,在 ORACLE 中有一個內置功能調用SEQUENCE可用於NEW_ORDER_ID 您可以通過下面的鏈接進行檢查。 為 oracle plsql 添加序列

我對您的代碼做了一些更改。 希望它現在工作正常。 請訪問這里。

CREATE or REPLACE PROCEDURE ADD_ORDER (
    CUSTOMER_ID     IN NUMBER 
    NEW_ORDER_ID    OUT NUMBER
) AS

  CURSOR get_max_order_no IS
    SELECT MAX(order_no)
    FROM ORDERS;
  rec_ NUMBER := 0;  

BEGIN

  OPEN get_max_order_no;
  FETCH get_max_order_no INTO rec_;
  CLOSE get_max_order_no;

  NEW_ORDER_ID := rec_ + 1;

  INSERT INTO ORDERS
    (ORDER_NO, REP_NO, CUST_NO, ORDER_DT, STATUS)
  VALUES 
    (NEW_ORDER_ID, 36, CUSTOMER_ID, SYSDATE, 'C');

END ADD_ORDER;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM