0
create or replace
PROCEDURE XXB_RJT_HEADER_PROCEURE 
  (
    V_PROD_ID  IN NUMBER,
    V_WARE_ID  IN XXB_RJT_HEADER.WAREHOUSE_ID% TYPE,
    V_PAY_METH IN XXB_RJT_HEADER.PAYMENT_METHOD% TYPE,
    V_PAY_STAT IN XXB_RJT_HEADER.PAYMENT_STATUS% TYPE,
    V_ORD_ID   IN XXB_RJT_HEADER.ORDER_ID% TYPE,
    V_ORD_DT   IN XXB_RJT_HEADER.ORDER_DATE% TYPE )
AS
  V_PROD_NM VARCHAR2(50);
  V_WAR_NM  VARCHAR2(15);
BEGIN
  SELECT PRODUCT_CAT
  INTO V_PROD_NM
  FROM xxb_rjt_inventory
  WHERE XXB_RJT_INVENTORY.product_id= V_prod_id;
  SELECT WAREHOUSE_NAME
  INTO V_WAR_NM
  FROM xxb_rjt_inventory
  WHERE XXB_RJT_INVENTORY.product_id= V_prod_id;

  INSERT
  INTO XXB_RJT_HEADER
    (                  /*second error*/
      warehouse_id,
      PAYMENT_METHOD,
      payment_status,
      product_name,
      order_id,
      wareshouse_name,
      order_date
    )
    VALUES
    (
      V_warehouse_id,
      v_pay_meth,  /*First error*/
      V_pay_stat,
      V_prod_nm,
      V_ord_id,
      V_war_nm,
      V_ord_dt
    );



END XXB_RJT_HEADER_PROCEURE;

これをコンパイルすると、次のエラーが発生します

Error(37,7): PL/SQL: ORA-00984: column not allowed here

Error(24,65530): PL/SQL: SQL Statement ignored

事前に助けてくれてありがとう

4

3 に答える 3

4

「V_warehouse_id」はどこにも宣言されていません。

于 2009-08-14T20:32:15.937 に答える
2

ORA-00984エラーは次のことを意味します:

INSERTステートメントのVALUES句など、許可されていない式で列名が使用されました。

INSERTのVALUES部分をチェックして、どの引数も列ではないことを確認してください。

それを修正したら、他のエラーがなくなるかどうかを確認します。「PL/SQL:SQL文が無視されました」は、すでに別のエラーが発生した後に表示されるようです。

于 2009-08-14T19:57:00.297 に答える
2

次のように書き換えることができます (未テスト):

create or replace
PROCEDURE XXB_RJT_HEADER_PROCEURE 
  (
    V_PROD_ID  IN xxb_rjt_inventory.product_id%type,
    V_WARE_ID  IN XXB_RJT_HEADER.WAREHOUSE_ID% TYPE,
    V_PAY_METH IN XXB_RJT_HEADER.PAYMENT_METHOD% TYPE,
    V_PAY_STAT IN XXB_RJT_HEADER.PAYMENT_STATUS% TYPE,
    V_ORD_ID   IN XXB_RJT_HEADER.ORDER_ID% TYPE,
    V_ORD_DT   IN XXB_RJT_HEADER.ORDER_DATE% TYPE )
AS
BEGIN

  INSERT
  INTO XXB_RJT_HEADER
    (                  
      warehouse_id,
      PAYMENT_METHOD,
      payment_status,
      product_name,
      order_id,
      wareshouse_name,
      order_date
    )
    select 
      V_ware_id,
      v_pay_meth,  
      V_pay_stat,
      product_cat,
      V_ord_id,
      warehouse_name,
      V_ord_dt
    from xxb_rjt_inventory
    where product_id= V_prod_id;

END XXB_RJT_HEADER_PROCEURE;

これは、SQL ステートメントが 2 つ少なく、宣言する変数が 2 つ少ないことを意味します。また、プロシージャの名前を変更します。プロシージャの代わりにプロシージャを記述します。プロシージャの最初のパラメータの型も変更しました。

于 2009-08-15T12:02:20.537 に答える