0

我在 Oracle db 中创建了一个将 Customer 插入到我的表中的存储过程

这是我的代码:

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 数据库或其他数据库中调用它

你能指导我一下吗...

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 语法)。

在一个过程中提交通常被认为是不好的做法,因为该过程通常成为较长业务事务的一部分(例如,插入新客户和地址)并且提交应该由应用程序代码控制。

大写的代码比小写的更难阅读——这就是为什么高速公路上的方向标志不是大写的。

插入的开始-结束块根本不需要。

“出生地”拼写错误。

因此,我建议您要转换为 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 回答
0

要通过 ESQL 调用外部过程,首先需要声明外部函数。

如下所示:

CREATE PROCEDURE DoSomething (IN in1 CHARACTER, OUT out1 CHARACTER, OUT out2 CHARACTER)
    LANGUAGE DATABASE
    EXTERNAL NAME "DoSomething";

现在您可以从 ESQL 函数调用此函数,如下所示:

CALL DoSomething(in,out1,out2) IN Database.yourschema.yourDB;

PS您传递的参数必须与您的存储过程的参数兼容。

于 2013-05-06T07:42:38.357 回答