我是Oracle存储过程的新手。我写了下面的存储过程并给出结果。
我相信表变量和参数变量或同名。如何在不更改变量名的情况下处理这种情况.O
CREATE OR REPLACE PROCEDURE procedval (Code IN varchar(50),Id1 OUT INTE)
AS
BEGIN
Id1 := 0;
SELECT Id1 INTO id1
FROM tabl1
WHERE Code = Code;
END;
答案 0 :(得分:1)
尝试SELECT tabl1.Id1 INTO Id1...
答案 1 :(得分:0)
试试这个:
with t as
(SELECT Id1 as New_Id1, Code as New_code)
FROM tabl1)
select New_Id1 into Id1
from t
WHERE New_code = Code;
另一个解决方案就是这个:
execute immediate 'select Id1 from tabl1 where Code = :b' into Id1 using Code;
答案 2 :(得分:0)
你无法做任何事情,这就是为什么要制定标准的变量声明。
其中之一是,PL/SQL
变量应以l_
(本地)或g_
(全局)为前缀
数据库在判断哪个操作数(左或右)是db列或变量时最终会出现歧义。
另外,为了添加更多亮点,查询中使用的任何变量都将被视为bind variable implicitly.
答案 3 :(得分:0)
一些问题:
VARCHAR
datatype should not be used和VARCHAR2
- VARCHAR
当前与VARCHAR2
同义,但VARCHAR数据类型计划重新定义为单独的数据用于可变长度字符串的类型与不同的比较语义相比(即对于VARCHAR2
,空字符串等同于NULL
值,但是当重新定义VARCHAR
时,空VARCHAR
}将不等同于NULL
)。VARCHAR2
而不是VARCHAR(50)
。
%TYPE
- tabl1.code%TYPE
和tabl1.id1%TYPE
。SELECT
语句完成(如果您需要异常处理程序,那么您可以根据需要在那里定义它。)类似的东西:
Oracle 11g R2架构设置:
CREATE TYPE INTE IS OBJECT( x NUMBER(3), y NUMBER(3) )
/
CREATE TABLE tabl1 (
code VARCHAR2(50),
id1 INTE
)
/
INSERT INTO tabl1 VALUES ( 'a', INTE( 3, 4 ) )
/
CREATE OR REPLACE PROCEDURE procedval (
code IN tabl1.code%TYPE,
Id1 OUT tabl1.id1%TYPE
)
AS
BEGIN
SELECT t.Id1
INTO Id1
FROM tabl1 t
WHERE t.Code = code;
EXCEPTION
WHEN NO_DATA_FOUND THEN
Id1 := NULL;
END;
/