我在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数据库或其他数据库中调用它
你能指导我一个回合......答案 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。您传递的参数必须与存储过程的参数兼容。