当前位置:首页>开发>正文

Oracle中存储过程字符串长度问题 Oracle中的存储过程,怎么获取到游标的长度

2024-01-10 11:02:44 互联网 未知 开发

 Oracle中存储过程字符串长度问题 Oracle中的存储过程,怎么获取到游标的长度

Oracle中存储过程字符串长度问题

VARCHAR2类型变量,在plsql中的范围是1 ~ 32767。所以编译肯定是能够通过的。
而且就算是报错,也应该在编译时出现。
执行时不应该出现你描述的问题,最好把你的代码发出来。还有报错截图。

Oracle中的存储过程,怎么获取到游标的长度


fech一次就可以了,然后直接退出。1、如果只想取得第一行的结果,fetch一次就行 2、好像没有直接的办法获取,可以采用迂回的办法,循环一遍,然后看%rowcount 3、select count(*) into v_num from tablename,先把表的总数放进一个变量,不过这个数可能跟游标的总长度不一致,如果在定义游标之前表的行数变化了,这个还是不准确的。fetch xxx bulk collect into 集合 然后通过 集合.count 这个应该好使吧。fetch之后不要加循环就行了

ORACLE 存储过程

几个问题
1、存储过程内参数不能定义长度
MENU_ID number(5) := 0,
TOP_MENU_ID number(5) := 0,
MENU_NAME VARCHAR(50) := ,
MENU_PATH VARCHAR(50) := ,
MENU_LEVEL number(5) = 0,
DB_Option_Action_ varchar(20) :=
错误
2、定义变量再as后,begin前面
ReturnValue number(5)
3、begin后给变量赋值不用set
ReturnValue:= -1
4、RETURNING COUNT(*) INTO ReturnValue不对
改为select count(*) into ReturnValue from TB_BG_MENU
5、最后一个end if
6、SELECT ReturnValue不是sql语句,错误

存储过程30个参数,实际使用时传入数量不定,怎么办


oracle 存储过程in out inout三种参数模式

oracle过程中定义了in|out|in out3中参数模式,每个参数可以选择其一
in 是参数的默认模式,这种模式就是在程序运行的时候已经具有值,在程序体中值不会改变。
举个例子
create or replace procedure update_price(
p_product_id in NUMBER,
p_factor in NUMBER)
AS
.....
你在引用这个过程的时候给参数传入值
exexute update_price(2,2.5)
这是定义的2个参数就得到了值,in模式下值不能变

out模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程
in out 表示高参数可以向该过程中传递值,也可以将某个值传出去
简单的说in参数就是传入但存储过程里面处理的参数
out参数就是返回值的参数。
in参数就像c 语言里函数一般的参数那样
而out函数就像c 里函数的引用类型参数一样
不知道我比喻是否正确,请高手指点
create or replace procedure gettest2(stdname in varchar2,p_cursor in out types.mytype)
as
begin
open p_cursor for select * from test where name=stdname
end
例如上面的存储过程
stdname是in参数,传进去供查询语句使用
p_cursor是 out参数,返回查询的结果集

--------------------------------------------------------------------------------------------------------------------

oracle 存储过程 in out2009-08-11 16:30
创建过程语法:

create [or replace] procedure procedure_name
[ (argment [ { in| in out }] type,
argment [ { in | out | in out } ] type
{ is | as }

( 注: 不用 declare 语句 )
Begin

exception

end

l 这里的IN表示向存储过程传递参数,OUT表示从存储过程返回参数。而IN OUT 表示传递参数和返回参数;
l 在存储过程内的变量类型只能指定变量类型;不能指定长度;
l 在AS或IS 后声明要用到的变量名称和变量类型及长度;
l 在AS或IS 后声明变量不要加declare 语句。

例1.

CREATE OR REPLACE PROCEDURE ModeTest (
p_InParameter IN NUMBER,
p_OutParameter OUT NUMBER,
p_InOutParameter IN OUT NUMBER) IS

v_LocalVariable NUMBER

BEGIN

v_LocalVariable := p_InParameter -- Legal

p_InParameter := 7 -- Illegal

p_OutParameter := 7 -- Legal

v_LocalVariable := p_outParameter -- Illegal

v_LocalVariable := p_InOutParameter -- Legal

p_InOutParameter := 7 -- Legal
END ModeTest
/

§16.2.2 使用过程
存储过程建立完成后,只要通过授权,用户就可以在SQLPLUS 、Oracle开发工具或第三方开发工具来调用运行。Oracle使用EXECUTE 语句来实现对存储过程的调用。

EXEC[UTE] procedure_name( parameter1, parameter2…)

例:
CREATE PACKAGE emp_data AS
TYPE EmpRecTyp IS RECORD (
emp_id NUMBER(4),
emp_name VARCHAR2(10),
job_title VARCHAR2(9),
dept_name VARCHAR2(14),
dept_loc VARCHAR2(13))
TYPE EmpCurTyp IS REF CURSOR RETURN EmpRecTyp
PROCEDURE get_staff (
dept_no IN NUMBER,
emp_cv IN OUT EmpCurTyp)
END
/
CREATE PACKAGE BODY emp_data AS
PROCEDURE get_staff (
dept_no IN NUMBER,
emp_cv IN OUT EmpCurTyp) IS
BEGIN
OPEN emp_cv FOR
SELECT empno, ename, job, dname, loc FROM emp, dept
WHERE emp.deptno = dept_no AND emp.deptno = dept.deptno
ORDER BY empno
END
END
/
COLUMN EMPNO HEADING Number
COLUMN ENAME HEADING Name
COLUMN JOB HEADING JobTitle
COLUMN DNAME HEADING Department
COLUMN LOC HEADING Location
SET AUTOPRINT ON
VARIABLE cv REFCURSOR
EXECUTE emp_data.get_staff(20, :cv)

-----------------------------------
PROMPT

oracle 用 prompt实现打印功能,多用于提示信息。输入命令prompt tablename1;
标准输出为tablename1
PROMPT 告诉SQL*Plus 在屏幕上书写一行文字。你在这里使用了两个PROMPT命令;每个命令都在屏幕上打印一个空行,这对于垂直间距很有好处。ACCEPT命令是等待用户输入一个置换变量的值。ACCEPT命令中可选的PROMPT 子句在用户输入数值的同一行中显示了一条信息。你在PL/SQL 块的外面放置PROMPT 和 ACCEPT 是正确的:他们是SQL*Plus 命令,不是PL/SQL 。

oracle 存储过程 out参数

首先,恭喜你猜对了,要去掉参数。
想必这个规定是oralce本身定义好的规则。
仔细推敲一下,我想道理是这样的:
假设规定了传入参数的长度,一旦你传入的实际变量的长度超过定义的长度,那oralce怎么办? 还需要增加校验和提示吧?
这样以来莫不如不超过该类型的长度即可,大家用起来也方便:)

猜想你是和定义变量弄混了。变量的定义是要指定长度的。

最新文章