如何在Oracle数据库中实现ESQL(内部过程)中的过程

时间:2013-05-04 07:10:42

标签: oracle plsqldeveloper embedded-sql

我在Oracle数据库中创建了一个将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数据库或其他数据库中调用它

你能指导我一个回合......

2 个答案:

答案 0 :(得分: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语法)。

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

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

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

“birhtplace”拼错了。

所以我建议你想要转换为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;
/

答案 1 :(得分: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;

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