【发布时间】:2019-07-29 14:29:45
【问题描述】:
您好,我想在 PLSql 中编写 ISBN 验证。但是 dbms_output.put_line 不输出任何东西。我没有任何错误,但 dbms_output 是黄色的,带有警告:
无法解析符号“dbms_output”
检查信息:此检查执行未解析的 SQL 引用检查。
。我在 DataGrip 工作,是的,我启用了 SYS.dbms_output。
DECLARE
v_isbn VARCHAR(13) := 9783161484100;
BEGIN
isbn_validation(v_isbn);
end;
CREATE OR REPLACE PROCEDURE isbn_validation
(
p_isbn VARCHAR
)
IS
v_isbn VARCHAR(13);
v_checksum INTEGER := 0;
BEGIN
if LENGTH(p_isbn) = 10 THEN
v_isbn := CONCAT('978',p_isbn);
v_checksum := isbn13_checksum(v_isbn);
if(v_checksum = -1)THEN dbms_output.put_line(v_isbn || ' is a invalid isbn');
else
v_isbn:=CONCAT(v_isbn,CAST(v_checksum AS CHAR));
isbn_validation(v_isbn);
dbms_output.put_line(v_isbn || ' is a valid isbn');
end if;
elsif LENGTH(v_isbn) = 13 THEN
v_checksum := isbn13_checksum(v_isbn);
if(v_checksum = -1)THEN dbms_output.put_line(v_isbn || ' is a invalid isbn');
else
v_isbn:=CONCAT(v_isbn,CAST(v_checksum AS CHAR));
isbn_validation(v_isbn);
dbms_output.put_line(v_isbn || ' is a valid isbn');
end if;
end if;
end;
CREATE OR REPLACE FUNCTION isbn13_checksum
(
v_isbn VARCHAR
)
RETURN INTEGER
IS
v_checksum INTEGER := 0;
v_remainder INTEGER := 0;
BEGIN
FOR i IN 1..12 LOOP
if MOD(i,2) = 1 THEN
if SUBSTR(v_isbn,i) = 'X' THEN
v_checksum := v_checksum + 10;
else v_checksum := v_checksum + CAST(SUBSTR(v_isbn,i) AS INTEGER);
end if;
else
if SUBSTR(v_isbn,i) = 'X' THEN
v_checksum := v_checksum + (10 * 3);
else v_checksum := v_checksum + (CAST(SUBSTR(v_isbn,i) AS INTEGER) * 3);
end if;
end if;
end loop;
v_remainder := mod(v_checksum, 10);
if v_remainder = 0 THEN RETURN -1;
elsif(10-v_remainder)=10 THEN RETURN 0;
else RETURN (10 - v_remainder);
end if;
end;
【问题讨论】:
标签: oracle plsql datagrip dbms-output