题目如下
编写一个算命的过程,接收输入的一个生日(yyyymmdd),每2位相加取个位,最后得到一位数字,此数字为偶数(命好),为质数(一般),否则为(命运悲惨).算法如下:
19850324
0735356
708881
78669
5425
967
53
8 -------------------偶数,命好好纠结 刚学ORACLE 的过程和函数不是很会 ,求解谢谢了...
编写一个算命的过程,接收输入的一个生日(yyyymmdd),每2位相加取个位,最后得到一位数字,此数字为偶数(命好),为质数(一般),否则为(命运悲惨).算法如下:
19850324
0735356
708881
78669
5425
967
53
8 -------------------偶数,命好好纠结 刚学ORACLE 的过程和函数不是很会 ,求解谢谢了...
解决方案 »
- 求助:关于游标的使用(在不知道表结构的情况下使用游标)
- 求用SELECT 实现多行合并为一行的SQL写法
- 复制表内容的SQL语句 求助
- 大家都是通过安装oracle客户端然后建立数据库连接(database link)连接来访问远程的ora server方式进行开发的嘛?
- 急!ORALCE 安装失败
- 在orcale中建表时字段的说明在那写???
- oracle中的job能否调用EXE文件?
- 哪个网站提供有Oracle Designer/2000的完全版下载,我是宽带!!!谢谢!!!
- 请教大侠,oracle 触发器能对二进制数据进行操作吗?
- oracle order by 查询要10分钟 求帮优化
- 大神看看小弟的代码那里错了PL/SQL
- oracle 自带的最大常量整数表示
查出了错误说下理由啊 谢谢-- test code
DECLARE
v_birthday VARCHAR2(8):='19999999';
v_res VARCHAR2(8):='';
v_length NUMBER(2):=0;
BEGIN
LOOP
SM_PRC(v_birthday,v_res);
v_virthday:=v_res;
BEGIN
SELECT length(v_virthday) INTO v_length FROM dual;
END;
EXIT WHEN v_length=1;
END LOOP;
dbms_output.put_line(v_res);
END;--procedure
CREATE OR REPLACE PROCEDURE SM_PRC(inp_birthday IN VARCHAR2, v_res OUT VARCHAR2) IS
CURSOR getTwoNumAdd(v_data VARCHAR2, v_length NUMBER) IS
SELECT MOD((num+SECOND),10)
FROM(
SELECT num,lead(num) over(ORDER BY i_level) SECOND
FROM(
SELECT substr(v_data,i_level,1) num, i_level
FROM (
SELECT LEVEL i_level FROM dual CONNECT BY LEVEL < v_length
)
)
);v_birthday VARCHAR2(8);
v_check CHAR;
v_temp VARCHAR2(8);
BEGIN v_birthday := inp_birthday; BEGIN
SELECT nvl(trim(translate(v_birthday,'1234567890'||v_birthday, ' ')),'Y') INTO v_check FROM dual
--EXCEPTION WHEN no_data_found THEN
-- RETURN;
END; IF v_check<>'Y' THEN
dbms_output.put_line('input parameter has non-numper arph,please check. ' || inp_birthday);
v_rec:= NULL;
RETURN;
END IF; -- get the parameter's length
BEGIN
SELECT length(v_birthday) INTO v_length FROM dual;
--EXCEPTION WHEN THEN
END;
FOR v_temp IN getTwoNumAdd(v_birthday,v_length)LOOP
v_rec := v_res||v_temp;
END LOOP;END SM_PRC;-- err infomation:
/*
Compilation errors for PROCEDURE SYS.SM_PRCError: PLS-00103: 出现符号 "end-of-file"在需要下列之一时:
begin case declare
end exception exit for goto if loop mod null pragma raise
return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe
*/
String oldNum = "19850324";
String newNum = "";
int firstNum = 0;
int secondNum = 0;
while (oldNum.length() > 1) {
for (int i = oldNum.length(); i > 1; i--) {
firstNum = Integer.parseInt(oldNum.substring(i - 1, i));
secondNum = Integer.parseInt(oldNum.substring(i - 2, i - 1)); if ((firstNum + secondNum) > 9) {
newNum = String.valueOf(firstNum + secondNum).substring(1)
+ newNum;
} else {
newNum = firstNum + secondNum + newNum;
}
}
oldNum = newNum;
newNum = "";
} ;
switch(Integer.parseInt(oldNum))
{
case 0:
System.out.println("命好");
break;
case 2:
System.out.println("命好");
break;
case 4:
System.out.println("命好");
break;
case 6:
System.out.println("命好");
break;
case 8:
System.out.println("命好");
break;
case 9:
System.out.println("命一般");
break;
default:
System.out.println("命运悲惨");
break;
}
}
java测试下哈哈,不知道怎么算质数只能这样判断。
SELECT nvl(trim(translate(v_birthday,'1234567890'||v_birthday, ' ')),'Y') INTO v_check FROM dual--没分号
--EXCEPTION WHEN no_data_found THEN
-- RETURN;
END;
SELECT nvl(trim(translate(v_birthday,'1234567890'||v_birthday, ' ')),'Y') INTO v_check FROM dual --没分号
--EXCEPTION WHEN no_data_found THEN
-- RETURN;
END;
--cursor
CURSOR getTwoNumAdd(v_data VARCHAR2, v_length NUMBER) IS
SELECT to_char(MOD((num+SECOND),10)) a
FROM(
SELECT num,lead(num) over(ORDER BY i_level) SECOND
FROM(
SELECT substr(v_data,i_level,1) num, i_level
FROM (
SELECT LEVEL i_level FROM dual CONNECT BY LEVEL <= v_length
)
)
);v_birthday VARCHAR2(8);
v_check CHAR;
v_temp VARCHAR2(8);
v_length NUMBER(2,0);
v_result VARCHAR2(8):=' ';
BEGIN v_birthday := inp_birthday; -- check the parameter
BEGIN
SELECT nvl(trim(translate(v_birthday,'1234567890'||v_birthday, ' ')),'Y') INTO v_check FROM dual;
EXCEPTION WHEN no_data_found THEN
dbms_output.put_line('input parameter is invalid');
v_res:='null';
RETURN;
END; IF v_check<>'Y' THEN
dbms_output.put_line('input parameter has non-numper arph,please check. ' || inp_birthday);
v_res:= NULL;
RETURN;
END IF;
dbms_output.put_line(v_birthday);
-- get the parameter's length
BEGIN
SELECT length(v_birthday) INTO v_length FROM dual;
EXCEPTION WHEN OTHERS THEN
dbms_output.put_line('some error currence, please try again. ');
END;
FOR v_temp IN getTwoNumAdd(v_birthday,v_length)LOOP
v_result := trim(v_result||v_temp.a);
END LOOP;
v_res:=v_result;
END SM_PRC;
------------------------------------------------------------------------------
-- test codeDECLARE
v_birthday VARCHAR2(8):='19850324';
v_res VARCHAR2(8):='';
v_length NUMBER(2):=0;
v_length_res NUMBER(2):=0;BEGIN
LOOP
SM_PRC(v_birthday,v_res);
v_birthday:=trim(v_res);
BEGIN
SELECT length(v_birthday) INTO v_length FROM dual;
END;
EXIT WHEN v_length=1;
END LOOP;dbms_output.put_line('the result is: '||v_birthday);
END;
--------------------------------------------------------------
--result
--
/*
19850324
0735356
708881
78669
5425
967
53
the result is: 8
***/
DECLARE
v_birthday VARCHAR2(8):='19851001';
v_res VARCHAR2(8):='';
v_length NUMBER(2):=0;
v_length_res NUMBER(2):=0;BEGIN
LOOP
SM_PRC(v_birthday,v_res);
v_birthday:=trim(v_res);
BEGIN
SELECT length(v_birthday) INTO v_length FROM dual;
END;
EXIT WHEN v_length=1;
END LOOP; BEGIN
SELECT decode(v_birthday,
'0','good',
'2','good',
'4','good',
'6','good',
'8','good',
'1','ok',
'3','ok',
'5','ok',
'7','ok',
'7','bad'
) res
INTO v_res
FROM dual;
EXCEPTION WHEN OTHERS THEN
dbms_output.put_line('error, failed');
v_res := NULL;
END; dbms_output.put_line('the result is: '||v_res);
END;