1

私は11gを使用しています私はテーブルを持っています

CREATE TABLE Agency
(
AgencyID          int   not null PRIMARY KEY,
AgencyName        VARCHAR2(30) not null,
AgencyLtrCode     VARCHAR2(10) not null,
IsActive          VARCHAR2(3) DEFAULT 'yes'NOT NULL,
LastListSentData  DATE DEFAULT SYSDATE ,
LetterSendDate    DATE DEFAULT SYSDATE ,
CertificationDate DATE DEFAULT SYSDATE ,
CeresNo       int,
AgencyAreaID      int not null,
CONSTRAINT fk_Agency FOREIGN KEY (AgencyAreaID) REFERENCES AgencyArea(AriaID)
);

手順を使用して新しいレコードを挿入します

create or replace PROCEDURE insert_AGENCY_Procedure(
       AGENCYID IN AGENCY.AGENCYID%TYPE,
       AGENCYNAME IN AGENCY.AGENCYNAME%TYPE,
       AGENCYLTRCODE IN AGENCY.AGENCYLTRCODE%TYPE,  
       ISACTIVE IN AGENCY.ISACTIVE%TYPE DEFAULT 'yes',
       LASTLISTSENTDATA IN AGENCY.LASTLISTSENTDATA%TYPE DEFAULT SYSDATE,
       LETTERSENDDATE IN AGENCY.LETTERSENDDATE%TYPE DEFAULT SYSDATE,
       CERTIFICATIONDATE IN AGENCY.CERTIFICATIONDATE%TYPE DEFAULT SYSDATE,
       CERESNO IN AGENCY.CERESNO%TYPE,
       AGENCYAREAID IN AGENCY.AGENCYAREAID%TYPE)
IS BEGIN
  INSERT INTO AGENCY("AGENCYID", "AGENCYNAME","AGENCYLTRCODE","ISACTIVE","LASTLISTSENTDATA","LETTERSENDDATE","CERTIFICATIONDATE","CERESNO","AGENCYAREAID") 
  VALUES             (AGENCYID, AGENCYNAME,AGENCYLTRCODE,ISACTIVE,LASTLISTSENTDATA,LETTERSENDDATE,CERTIFICATIONDATE,CERESNO,AGENCYAREAID);
  COMMIT;
END;​​

現在、エラー "17行目のエラー:PLS-00103:シンボル"""に遭遇しました。17行目はENDのみでした。その上に

挿入を送信すると、次のようになります

BEGIN
insert_AGENCY_Procedure(9003,'Some Other Church', 'SomOTCh','no',10-10-2011,10/10/2011,10/10/2011,17,2   );
END;

エラーをスローします

ORA-06550: line 2, column 4:
PLS-00306: wrong number or types of arguments in call to 'INSERT_AGENCY_PROCEDURE'
ORA-06550: line 2, column 4:
PL/SQL: Statement ignored

または他のインサートのような

BEGIN
insert_AGENCY_Procedure(9003,'Some Other Church',SomOTCh',DEFAULT,DEFAULT,DEFAULT,DEFAULT,17,2   );
END;

エラーをスローします

ORA-06550: line 2, column 64:
PLS-00103: Encountered the symbol "DEFAULT" when expecting one of the following:

   ( - + case mod new not null 

問題は、私の手順の何が問題になっているのかということです。私はこの問題を解決しようとしていましたが、行き詰まりました:(

4

4 に答える 4

1

9つの値を渡していますが、手順では8つしか期待していません。AgencyLtrCodeテーブル定義から、手順に欠落しているようです。

10-10-2011最初の呼び出しでは、日付をまたはとして渡します。10/10/2011これは、日付ではなく(異なる)数値として評価されます。少なくともそれらを一重引用符で囲む必要がありますが、to_date('10/10/2011', 'DD/MM/YYYY')暗黙の変換に依存するのではなく、実際には日付マスクを指定する必要があります。

一般に、デフォルトを使用する場合は、これらのパラメーターを省略し、渡さないでくださいDEFAULT。それはその文脈では有効ではありません。ただし、デフォルトの後に渡す値があるため、パラメータに名前を付ける必要があります。

insert_agency_procedure(agency_id=>9003, ...);
于 2012-11-14T21:15:31.263 に答える
1

まず、INSERT_AGENCY_PROCEDUREプロシージャは8つのパラメータを受け取るように定義されていますが、9つのパラメータを渡そうとしています。を渡そうとしているようですが、プロシージャはパラメータとしてをAgencyLtrCode取りません。AgencyLtrCodeの受け渡しを停止するか、AgencyLtrCodeそのパラメータを受け入れるようにプロシージャを変更する必要があります。

次に、宣言を指定してプロシージャに日付を渡す必要があります。日付パラメーターに渡すものは日付ではないため(暗黙的に日付に変換できないため)、実際のプロシージャー呼び出しはエラーになります。AgencyLtrCode3番目のパラメーター(上記で説明したように見えるもの)を削除すると仮定すると、次のようなものが必要になります。

BEGIN
  insert_AGENCY_Procedure(9003,
                          'Some Other Church', 
                          'no', 
                          to_date('10-10-2011', 'DD-MM-YYYY'), 
                          to_date('10/10/2011', 'DD/MM/YYYY'),
                          to_date('10/10/2011','DD/MM/YYYY'),
                          17,
                          2   );
END;

第三に、あなたの手順は正しくありません。パラメータ、、、LASTLISTSENTDATAおよびLETTERSENDDATECERTIFICATIONDATE日付として定義されているため、これらを呼び出さないto_dateでください。その場合、Oracleにセッションのを使用して日付を文字列に暗黙的に変換させてNLS_DATE_FORMATから、明示的なフォーマットマスクを使用して文字列を日付に変換し直します。セッションNLS_DATE_FORMATが期待したものでない場合、それは失敗します。

最後に、プロシージャ宣言の途中でオプションのパラメータを宣言することが正しいことはめったにありません。位置バインディングを使用し、パラメーターを省略できるようにする場合は、オプションのパラメーターをパラメーターリストの最後に配置する必要があります。パラメータリストの途中でオプションのパラメータを定義してから、名前付きバインドを使用できます(図のようにDazzaL)が、将来の開発者に強制的に使用させたいことはめったにありません。

更新されたプロシージャでは、AgencyLtrCodeパラメータの宣言が正しくないようです

AGENCYLTRCODE IN AGENCYLTRCODE%TYPE

する必要があります

AGENCYLTRCODE IN AGENCY.AGENCYLTRCODE%TYPE

テーブルの名前がありません。

于 2012-11-14T21:17:04.007 に答える
0

DEFAULTキーワードはありません。デフォルトを省略するだけです。

ただし、あなたの場合、APIの途中にデフォルトがあるので、NAMED表記を使用する必要があります。

begin
  insert_agency_procedure(agencyid => 9003,
                          agencyname => 'Some Other Church',
                          isactive => 'SomOTCh',
                          ceresno => 17,
                          agencyareaid => 2 );
end;
/
or mixed:
begin
  insert_agency_procedure(9003, 'Some Other Church',
                          'SomOTCh',
                          ceresno => 17,
                          agencyareaid => 2 );
end;
/

そしてあなたが与えた最初の例で:

BEGIN
insert_AGENCY_Procedure(9003,'Some Other Church', 'SomOTCh','no',10-10-2011,10/10/2011,10/10/2011,17,2   );
END;

そのような日付を入力することはできません。まずそれらを引用します。次に、常にフォーマットマスクを使用します。

BEGIN
insert_AGENCY_Procedure(9003,'Some Other Church', 'SomOTCh','no',
                        to_date('10-10-2011', 'dd-mm-yyyy'),
                        to_date('10-10-2011', 'dd-mm-yyyy'),
                        to_date('10-10-2011', 'dd-mm-yyyy'),17,2   );
END;
于 2012-11-14T21:12:03.683 に答える
0

日付文字列を一重引用符で囲む必要があると思います(日付を指定する場合は、これらのパラメーターのデフォルト値があることを考慮してください)。

BEGIN
insert_AGENCY_Procedure(9003,'Some Other Church', 'SomOTCh','no','10-10-2011','10/10/2011','10/10/2011',17,2 );
END;
于 2012-11-14T21:12:44.610 に答える