我试图创建一个过程,它接受一个表值(varchar2),计算它出现的次数,然后返回一条语句,告诉用户它在表中以单词而不是数字的形式出现了多少次(3次而不是3次)。到目前为止我的代码是:
create or replace procedure user_search (x in varchar2) is y int;
begin
select count(*) as z into y from userpermissions where x=username;
dbms_output.put_line(to_char(y) || ' document(s) found under user: ' || x);
exception
when no_data_found then dbms_output.put_line('no documents for user: ' || x);
end;
当我运行这个时,它会说'pl/sql procedure completed successfully',但不返回任何东西。试图找出我在这里做错了什么,任何帮助将是感激的
你做错了几件事。
直接问题("not return anything")与您的过程无关;您需要先运行set serveroutput on
,以便在过程完成后将dbms_output
缓冲区显示到屏幕上。你这么做了吗?
你的异常永远不会被到达;如果在表中没有找到x
作为用户名,查询仍然返回一行:在这种情况下计数将为零。如果必须将其视为异常(和/或使用"none";而不是单词"0",你需要用不同的方式来处理。
当您开始查看输出时,您会注意到to_char(<number>)
并没有神奇地将数字转换成它的英文单词表示形式。你认为它做到了吗,或者你知道如何改变它,在这个阶段你只是在测试你目前得到的东西吗?
如果你在最后一部分需要帮助,这里有一个提示:
select deptno, to_char(to_date(count(*), 'j'), 'jsp') as english_num
from scott.emp
group by deptno
;
DEPTNO ENGLISH_NUM
---------- ---------------
30 six
20 five
10 three
如果你不明白这是如何工作的,看看to_date()
和to_char()
的'j'和'jsp'格式模型。