要求如下:输入参数:长度为6位的字符串
输出参数:1、过程是否执行成功标志(成功1,失败0)
2、长度为20位的字符串,格式为 YYYYMMDD+输入参数+随机数,其中YYYYMMDD为系统当前日期说明: 只创建该存储过程,不要对该用户下的过程、表等做其他操作我是这方面的菜鸟,能帮我说明白的这例子的追加50分!
输出参数:1、过程是否执行成功标志(成功1,失败0)
2、长度为20位的字符串,格式为 YYYYMMDD+输入参数+随机数,其中YYYYMMDD为系统当前日期说明: 只创建该存储过程,不要对该用户下的过程、表等做其他操作我是这方面的菜鸟,能帮我说明白的这例子的追加50分!
(
v_In varchar(6) ,
) return varchar(1),char(20)
is
in_string IN varchar(2),
out_string out varchar(2),
flag out number
)
ISBEGIN
out_string=to_char(sysdate,'yyyymmdd')||in_staring||to_char(trunc(dbms_random.value(1,100)))
flag:=1
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
WHEN OTHERS
THEN
-- Consider logging the error and then re-raise
return flag:=0;
END sp_test;
SQL> create or replace procedure sp_test(
2 para_in in varchar2,
3 para_out_flag out integer,
4 para_out_char out varchar2
5 )
6 is
7 begin
8 BEGIN
9 para_out_flag := 1;
10 para_out_char := to_char(sysdate,'yyyymmdd')||para_in||trunc(dbms_random.value(1000000,0));
11 exception when OTHERS THEN
12 para_out_flag := 0;
13 END;
14 end;
15 /Procedure createdSQL>
SQL> declare
2 p_out_flag integer;
3 p_out_char varchar2(20);
4 begin
5 sp_test('abcdef',p_out_flag,p_out_char);
6 dbms_output.put_line(p_out_flag);
7 dbms_output.put_line(p_out_char);
8 end;
9 /1
20081007abcdef89969PL/SQL procedure successfully completed
create or replace procedure testA(in_var varchar2, --输入参数
out_var1 out number, --输出参数
out_var2 out varchar2 --输出参数
) as
begin out_var1 := 1;
out_var2 := to_char(sysdate, 'YYYYMMDD') || in_var ||
lpad(mod(abs(dbms_random.random), 1000000), 6, '0');
exception
when others then
out_var1 := 0;
end;
/
CREATE OR REPLACE PROCEDURE sp_test(
in_string IN varchar(2), --这里是不是应该是 varcha(6) 啊!
out_string out varchar(2), --这里是不是应该是 varcha(20) 啊!
flag out number
)
ISBEGIN
out_string=to_char(sysdate,'yyyymmdd')||in_staring||to_char(trunc(dbms_random.value(1,100)))
flag:=1 --“||”是不是相当于连接的意思啊
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL; --此时退出,过程还是算成功完成吗
WHEN OTHERS
THEN
-- Consider logging the error and then re-raise
return flag:=0;
END sp_test;
顺便想问下in_n IN number(5) 是in_n被赋值为5的意思吗
应该是varchar2
刚才调试了下,发现2楼的有问题,呵呵,还有有4楼那位大哥的参照,被我调试出来啦,
刚查了下,但还有些小问题,不知道那位高手能帮我解决。1.trunc是什么意思啊2.dbms_random.value(1,100)与dbms_random.value(100,1)有什么区别啊,怎么感觉都一样啊3.dbms_random.value与dbms_random.random有什么区别啊4.有没有什么办法一定要让我输入长度为6位的字符串参数啊5.那个bigin前用is和用as有什么区别没啊由于昨天才开始接触这些东西,问题真的很多,希望高手们别烦啊,请高手们知道的话帮我解答一下啊,答者有分!
知道的高手帮我看看啊!(刚发的)
http://topic.csdn.net/u/20081007/11/de3f0917-ae43-4335-aee0-bd4f5649366a.html问题解决就结贴!
2、都一样
3、两个都是dbms_random包下的函数但参数不同
4、可以
还有2个小问题:
望高人解答!
1.用什么办法一定要让我输入长度为6位的字符串参数啊 (希望给出具体语句啊)
2.in_n IN number(5) 是 类型为number,长度为5 --这里的5是指什么啊,是指该变量最多可以存放5个数,还是最大只能存放5位数啊不管该问题是否解答,今中午前结贴,在此谢谢上面这些朋友帮忙啦
CREATE OR REPLACE PROCEDURE p_test(P_I_STR IN VARCHAR2,
P_O_STR OUT VARCHAR2,
P_O_FLAG OUT NUMBER) IS
l_str VARCHAR2(100);
BEGIN
IF P_I_STR IS NULL THEN
raise_application_error(-20099, '参数错误');
ELSIF LENGTHB(TRIM(P_I_STR)) > 6 THEN
l_str := SUBSTR(TRIM(P_I_STR), 1, 6);
ELSE
l_str := LPAD(P_I_STR, 6, '*');
END IF;
P_O_STR := TO_CHAR(SYSDATE, 'yyyymmdd') || l_str ||
SUBSTR(ABS(DBMS_RANDOM.RANDOM), 1, 6);
P_O_FLAG := 1;
EXCEPTION
WHEN OTHERS THEN
P_O_STR := SUBSTRb(Sqlerrm, 1, 20);
P_O_FLAG := 0;
END;
/
DECLARE
L_STR VARCHAR2(20);
L_NUM NUMBER;
BEGIN
P_TEST('aa', L_STR, L_NUM);
DBMS_OUTPUT.PUT_LINE(L_STR || ' ' || L_NUM);
P_TEST('aaaaaa', L_STR, L_NUM);
DBMS_OUTPUT.PUT_LINE(L_STR || ' ' || L_NUM);
P_TEST('aaabbbccc', L_STR, L_NUM);
DBMS_OUTPUT.PUT_LINE(L_STR || ' ' || L_NUM);
P_TEST('', L_STR, L_NUM);
DBMS_OUTPUT.PUT_LINE(L_STR || ' ' || L_NUM);
P_TEST(NULL, L_STR, L_NUM);
DBMS_OUTPUT.PUT_LINE(L_STR || ' ' || L_NUM);
END;
/
输出:
20081008****aa140275 1
20081008aaaaaa168284 1
20081008aaabbb156518 1
ORA-20099: 参数错误 0
ORA-20099: 参数错误 0
CREATE OR REPLACE PROCEDURE P_GET_DATE(
in_string IN varchar(6),
out_string out varchar(20),
flag out number
)
ISBEGIN
out_string=to_char(sysdate,'yyyymmdd')||in_staring||to_char(trunc(dbms_random.value(1,100)))
flag:=1
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
WHEN OTHERS
THEN
-- Consider logging the error and then re-raise
return flag:=0;
END P_GET_DATE;
2高手们不屑解答我是菜鸟给你解答哈哈
number(5)五位不是5个最多只能5位
你不可以建立一个字段输入值测试么??
para_in in varchar2,
para_out_flag out integer,
para_out_char out varchar2
)
is
BEGIN
if length(para_in)=6 then --输入参数6位才做连接操作并同过输出参数para_out_flag 告之成功
para_out_char := to_char(sysdate,'yyyymmdd')||para_in||trunc(dbms_random.value(100000,999999));--随机数的6位限制小学生都会
para_out_flag := 1;
elsif length(para_in)!=6 then --长度不等于6的不做连接操作只同过输出参数para_out_flag告之异常
para_out_flag := 0;
end if;
END;
set serveroutput on
SQL> declare
2 p_out_flag integer;
3 p_out_char varchar2(20);
4 begin
5 sp_test('456',p_out_flag,p_out_char);
6 dbms_output.put_line(p_out_char ||' '||p_out_flag);
7 end;
8 /
0
当长度不等于6的时候p_out_flag为0,那么为什么我要求输出p_out_char 确没值,这就涉及上面的过程 因为我在长度不为6只做输出p_out_char 那为什么还要dbms_output.put_line(p_out_char ||' '||p_out_flag);这样写
我只是要实现代码重用而已。
PL/SQL 过程已成功完成。
declare
p_out_flag integer;
p_out_char varchar2(20);
begin
sp_test('123456',p_out_flag,p_out_char);
dbms_output.put_line(p_out_char ||' '||p_out_flag);
end;
/
20081008123456429602 1PL/SQL 过程已成功完成。
我刚测试好!!
SQL中存储过程(有输入参数/输出参数) [已结帖,结帖人:cc41577]
加为好友
发送私信
在线聊天
cc41577
cc41577
等级:
可用分等级:贫农
总技术分:75
总技术分排名:120856
结帖率:77.78% 发表于:2008-10-07 08:39:34 楼主
要求如下: 输入参数:长度为6位的字符串
输出参数:1、过程是否执行成功标志(成功1,失败0)
2、长度为20位的字符串,格式为 YYYYMMDD+输入参数+随机数,其中YYYYMMDD为系统当前日期 说明: 只创建该存储过程,不要对该用户下的过程、表等做其他操作 我是这方面的菜鸟,能帮我说明白的这例子的追加50分! 给我再加50分