Stored procedures Oracle 11g-将布尔值传递给存储过程

Stored procedures Oracle 11g-将布尔值传递给存储过程,stored-procedures,oracle11g,Stored Procedures,Oracle11g,我正在尝试使用布尔输入参数创建存储过程:- 步骤1:我创建了一个如下表 CREATE TABLE STOREBOOL ( BOOLVAL NUMBER(1)); 步骤2:我创建了一个存储过程 CREATE OR REPLACE PROCEDURE boolProc(x boolean) AS BEGIN INSERT INTO storebool("boolval") VALUES(x); COMMIT; END; 基于以下链接:创建了一个过程 CREATE OR REPLACE P

我正在尝试使用布尔输入参数创建存储过程:-

步骤1:我创建了一个如下表

CREATE TABLE STOREBOOL ( BOOLVAL NUMBER(1));
步骤2:我创建了一个存储过程

CREATE OR REPLACE PROCEDURE boolProc(x boolean)
AS
BEGIN
    INSERT INTO storebool("boolval") VALUES(x);
COMMIT;
END;
基于以下链接:创建了一个过程

CREATE OR REPLACE PROCEDURE boolProc(x boolean)
AS
BEGIN
    INSERT INTO storebool("boolval") VALUES(x);
COMMIT;
END;
输出为:-

Warning: Procedure created with compilation errors.
Warning: Procedure created with compilation errors.
类似地,创建了第二个过程:

CREATE OR REPLACE PROCEDURE boolWrap(x int)
AS
BEGIN
IF (x=1) THEN
boolProc(TRUE);
ELSE
boolProc(FALSE);
END IF;
END;
输出为:-

Warning: Procedure created with compilation errors.
Warning: Procedure created with compilation errors.
步骤3:执行代码

BEGIN
boolWrap(1);
END;
/
它显示以下错误:

boolWrap(1);
*
ERROR at line 2:
ORA-06550: line 2, column 1
PLS-00905: object SCOTT.BOO
ORA-06550: line 2, column 1
PL/SQL: Statement ignored
如何正确运行它?

您是否注意到“使用编译错误创建”消息?通过
显示错误
,或通过查询
用户错误
视图,您可以立即查看错误

在第一个步骤中,您将执行以下操作:

INSERT INTO storebool("boolval") VALUES(x);
。。。这有两个问题:(a)您没有一个名为
“boolval”
的列;它被创建为不带引号的
BOOLVAL
,因此要么引用它不带引号,要么引用数据字典中出现的大写字母;(b)您试图将
number
列设置为
布尔值。Oracle SQL没有布尔类型,但没有可用的隐式转换。您需要定义哪个数字表示TRUE,哪个数字表示FALSE,然后插入该数字而不是布尔
x
参数。因此,您会看到如下错误:

4/46           PLS-00382: expression is of wrong type
4/28           PL/SQL: ORA-00904: "boolval": invalid identifier
boolWrap
无法编译,因为
boolProc
无效

你的
boolProc
boolWrap
程序真的颠倒了;您希望“real”过程接受一个数字参数,包装器接受一个布尔值并将其转换为一个数字以调用
real
one

这可能更有意义:

CREATE TABLE STOREBOOL (BOOLVAL NUMBER(1),
  CONSTRAINT BOOLCHECK CHECK (BOOLVAL IN (0,1))
);

CREATE OR REPLACE PROCEDURE boolProc(p_bool_num number)
AS
BEGIN
    INSERT INTO storebool(boolval) VALUES (p_bool_num);
END;
/

CREATE OR REPLACE PROCEDURE boolWrap(p_bool boolean)
AS
    l_bool_num number;
BEGIN
    IF p_bool THEN
        boolProc(1);
    ELSE
        boolProc(0);
    END IF;
END;
/
然后可以使用数字参数调用
boolProc
,或者使用布尔参数调用
boolWrap

BEGIN
    boolProc(1);
END;
/

BEGIN
    boolWrap(false);
END;
/

select * from storebool;

   BOOLVAL
----------
         1 
         0 

当从Java代码调用它时。我做了以下操作:-Connection conn=DriverManager.getConnection(“jdbc:oracle:oci8:@”、“scott”、“tiger”);CallableStatement pstmt=conn.prepareCall(“开始boolWrap(?);结束;”);pstmt.setBoolean(1,真);pstmt.execute();但它显示了错误6550ORA-06550:第1行第7列:PLS-00306:调用'BOOLWRAP'ORA-06550:第1行第7列:PL/SQL:语句时参数的数量或类型错误ignored@sasi-,它被转换为
类型:“JDBC驱动程序不支持将布尔参数传递给PL/SQL存储过程”。您需要使用
setInt
调用
boolProc
。但是我从名字猜这就是你开始的地方?我的要求是从java传递布尔值。所以我用的是boolWrap。是否有一种从java传递布尔值的方法。不是使用
setBoolean
,而是可以在
setInt
调用
boolProc
中对其进行解码;e、 g.
setInt(1,boolvar?1:0)
?但在链接到的文档中有单独的
boolProc
boolWrap
,用于访问需要布尔值的现有进程;如果您所做的只是在表中插入一个数字,那么一个布尔包装器是没有意义的,除非您想从PL/SQL调用它。如果您必须(通过JDBC)传递一个数字,那么您根本不需要包装程序?