提问人:Chriscolle 提问时间:10/10/2023 最后编辑:Chriscolle 更新时间:10/10/2023 访问量:73
Oracle SQL。用户定义的函数不会在 SELECT 语句中运行,但如果包装在过程中,则会运行
Oracle SQL. User defined function will not run in SELECT statement, but will run if wrapped in procedure
问:
我有一个关于选民登记册的 oracleSQL 数据库。为了检查选民之前是否投票过,我创建了一个如下所示的函数。PreviouslyVoted(election_code, electorate_code, voter_id)
create or replace FUNCTION previouslyVoted(election_code_in IN NUMBER, electorate_id_in IN NUMBER, voter_id_in IN NUMBER)
RETURN BOOLEAN IS
voter_id_temp NUMBER;
BEGIN
SELECT COUNT(*) INTO voter_id_temp
FROM ballot_issuance bi
WHERE bi.electorate_id = electorate_id_in
AND bi.election_serial_number = election_code_in
AND bi.voter_id = voter_id_in;
RETURN voter_id_temp > 0 ;
END;
现在我想从PHP服务器调用它。
我尝试运行发送以下查询:
Select previouslyVoted(" .ELECTION ."," .ELECTORATE .", $oracle_voter_id) "Result" FROM dual;
这没有用。我收到以下错误 错误:
ORA-00902: invalid datatype
00902. 00000 - "invalid datatype"
*Cause:
*Action:
Error at Line: 1 Column: 8
我尝试去sqldeveloper并运行
Select previouslyVoted(20190404,1,13321) "Result" FROM dual;
再次出现相同的错误。我尝试将表达式扩展到
SELECT
"S4026115"."PREVIOUSLYVOTED"(20190404, 1, 13321) "Result"
FROM
"SYS"."DUAL" "A1";
但是再次出现相同的错误。 有趣的是:如果我将其包装在如下所示的程序中,它完全可以正常工作。
create or replace PROCEDURE runprevvoted
AS
has_voted BOOLEAN;
BEGIN
has_voted := previouslyVoted(20190404, 1, 13321);
IF has_voted THEN
DBMS_OUTPUT.PUT_LINE('This voter has previously voted.');
ELSE
DBMS_OUTPUT.PUT_LINE('This voter has not previously voted.');
END IF;
END;
希望有人能帮助我了解我做错了什么!先谢谢你
答:
5赞
Koen Lostrie
10/10/2023
#1
您在问题的开头调用函数“beforeVoted”,但在包装器中引用“has_voted”。我假设它们是一样的? 问题很可能是该函数返回布尔值,而 SQL 在 23c.pl/sql 之前没有布尔值数据类型,而布尔值数据类型。因此,正在发生的事情是 pl/sql 函数成功执行,但 SQL 语句出错,因为它不知道数据类型。
例:
koen19c>set serveroutput on size 999999
koen19c>CREATE OR REPLACE FUNCTION istrue RETURN BOOLEAN
2 AS
3 BEGIN
4 RETURN true;
5 END;
6* /
Function ISTRUE compiled
koen19c>BEGIN
2 IF istrue() THEN
3 dbms_output.put_line('it is true !');
4 END IF;
5 END;
6* /
it is true !
PL/SQL procedure successfully completed.
koen19c>SELECT istrue() from dual;
Error starting at line : 1 in command -
SELECT istrue() from dual
Error at Command Line : 1 Column : 8
Error report -
SQL Error: ORA-00902: invalid datatype
00902. 00000 - "invalid datatype"
*Cause:
*Action:
koen19c>
解决方案,修改函数,使其返回字符串('Y'/'N', 'true'/'false')或数字(1/0)
评论