0

テーブルに Customer を挿入するストア プロシージャを Oracle db に作成します。

これは私のコードです:

CREATE OR REPLACE PROCEDURE THP.INSERT_CUSTOMER(

     P_CUSTNAME          IN       VARCHAR2,
     P_CUSTLAST          IN       VARCHAR2,
     P_CUSTFATHER        IN       VARCHAR2,
     P_NATIONNO          IN       NUMBER,
     P_BIRTHDAY          IN       VARCHAR2,
     P_BIRHTPLACE        IN       VARCHAR2,
     P_EMAIL             IN       VARCHAR2,
     P_CUSTENAME         IN       VARCHAR2,
     P_CUSTELAST         IN       VARCHAR2,
     P_OWNID             IN       NUMBER,
     P_CUSTTYPEID        IN       NUMBER,
     P_GENDERID          IN       NUMBER,
     P_BILLSTID          IN       NUMBER,
     P_BILLSPID          IN       NUMBER,
     P_IDNO              IN       varchar2,



     RESULT OUT INTEGER) IS
     CNT NUMBER;

BEGIN
     RESULT := 1;
     CNT := 0;
     SELECT COUNT(1) INTO CNT FROM THP.TBCUSTOMER WHERE NATIONNO=P_NATIONNO ;

     IF CNT=1 THEN  

         COMMIT;
         RESULT := 1;  --IF  RECORD is EXIST

     ELSE
        BEGIN  
            INSERT INTO TBCUSTOMER(CUSTID,CUSTNAME,CUSTLAST,CUSTFATHER,NATIONNO,BIRTHDAY,BIRHTPLACE,EMAIL,CUSTENAME,CUSTELAST,OWNID,CUSTTYPEID,GENDERID,BILLSTID,BILLSPID,IDNO)
            VALUES(CUSTID_SEQ.NEXTVAL,P_CUSTNAME,P_CUSTLAST,P_CUSTFATHER,P_NATIONNO,P_BIRTHDAY,P_BIRHTPLACE,P_EMAIL,P_CUSTENAME,P_CUSTELAST,P_OWNID,P_CUSTTYPEID,P_GENDERID,P_BILLSTID,P_BILLSPID,P_IDNO);
         COMMIT;
         RESULT :=0;  --IF INSERT NEW COLUMN

        END;  
     END IF;
END INSERT_CUSTOMER;
/

今、私はこの手順を ESQL で使用し、ESQL で直接作成し、Oracle データベースや他の DB から呼び出すのではなく、

それについて教えてください...

4

2 に答える 2

0

一般的なコメントであり、回答ではありません...

count(1)

count(1) = count(*)、これは「行数を数える」の標準形式です。count(1) には利点がないため、count(*) を使用することをお勧めします。

RESULT := 1

手順の最初は冗長です

CNT := 0

...も冗長です。変数名はあまり意味がなく、失礼な言葉を思わせるかもしれないので、rows_found に変更してください。

引数の前に P_ を付ける必要はありません。それらのいずれかを SQL ステートメントで使用し、データベース オブジェクト名との競合を解消する必要がある場合は、プロシージャ名をプレフィックスとして付けます。次のようになります。

WHERE NATIONNO= INSERT_CUSTOMER.NATIONNO

NATIONNO は、顧客テーブル内で一意になるように制約されていますか? そうでない場合は、次を使用します。

SELECT COUNT(*)
INTO   CNT
FROM   THP.TBCUSTOMER
WHERE  NATIONNO=INSERT_CUSTOMER.NATIONNO AND
       ROWNUM = 1;

(ちなみに、12g では LIMIT SQL 構文が導入されます)。

プロシージャでのコミットは、多くの場合、悪い習慣であると見なされます。これは、プロシージャがより長いビジネス トランザクションの一部になることが多く (たとえば、新しい顧客と住所の挿入)、コミットはアプリケーション コードで制御する必要があるためです。

大文字のコードは小文字よりも読みにくい - 高速道路の方向標識が大文字でないのはそのためです。

挿入用の begin-end ブロックはまったく必要ありません。

「出身地」のスペルが間違っています。

したがって、実際に ESQL に変換したいものは次のとおりであることをお勧めします。

create or replace procedure thp.insert_customer(
    custname   in  varchar2,
    custlast   in  varchar2,
    custfather in  varchar2,
    nationno   in  number  ,
    birthday   in  varchar2,
    birhtplace in  varchar2,
    email      in  varchar2,
    custename  in  varchar2,
    custelast  in  varchar2,
    ownid      in  number  ,
    custtypeid in  number  ,
    genderid   in  number  ,
    billstid   in  number  ,
    billspid   in  number  ,
    idno       in  varchar2,
    result     out integer) is
rows_found number;
begin
    select count(*)
    into   rows_found
    from   thp.tbcustomer
    where  nationno=insert_customer.nationno;

    if rows_found = 1 then
        result := 1;
    else
        insert into
        tbcustomer(
            custid    ,
            custname  ,
            custlast  ,
            custfather,
            nationno  ,
            birthday  ,
            birthplace,
            email     ,
            custename ,
            custelast ,
            ownid     ,
            custtypeid,
            genderid  ,
            billstid  ,
            billspid  ,
            idno)
        values(
            custid_seq.nextval,
            custname  ,
            custlast  ,
            custfather,
            nationno  ,
            birthday  ,
            birthplace,
            email     ,
            custename ,
            custelast ,
            ownid     ,
            custtypeid,
            genderid  ,
            billstid  ,
            billspid  ,
            idno);

        result :=0;
     end if;
end insert_customer;
/
于 2013-05-04T09:28:01.563 に答える