1. The One you write is Procedure not function . So you can not use it in SQL statement . You must use it like : exec your_procedure_name(your_arguments); 2. It looks ok
存储过程不能用在SQL语句中 从PL/SQL2.1开始,如果独立的或打包的存储函数满足一些条件,可以在SQL语句中调用: 1。函数不能修改任何数据库表(8I中有所放宽) 2。为实现远程连接,函数不能读或写包变量的值 3。从SELECT,VALUES,SET子句执行的函数调用可以写包变量,其他所有子句中的函数必须是WNPS纯层 4。不能从CREATE TABLE或ALTER TABLE命令的CHECK子句调用该存储函数,也不能用来说明列的默认值 除此以外,用户定义的函数还必须满足下面的要求才能实现从SQL语句中的调用 1。只能用IN参数,不能用IN或 IN OUT 2。形参只能是数据库类型,不能使用PL/SQL类型,如BOOLEAN或RECORD 3。返回类型必须是数据库类型 4。不能使用COMMIT或ROLLBACK 5。不能提交任何ALTER SESSION或ALTER SYSTEM命令
thank you everybody, next question 我创建完函数之后,调用时报错 ERROR at line 1: ORA-06575: Function FMTSTR is in an invalid state 请问什么原因?怎样解决?
你的function FMTSTR处于INVALID状态,是由于你最后一次编译时有错误导致的。从新编译成功就可以用了。可以运行改语句查询他所处的状态: select object_name,object_type,status from user_objects where object_type='FUNCTION' and object_name='TESTZYZ'
TO zhaoyongzhu 那我怎样知道编译过程中出了哪些错?我现在一重新创建,只报一句 Warning: Function created with compilation errors.
UNIX下面有没有调试工具的? CREATE OR REPLACE FUNCTION fmtstr ( s_str IN VARCHAR2 ) RETURN VARCHAR2 IS i INTEGER; s_out VARCHAR2(36); BEGIN FOR i IN 1..Length(s_str) LOOP IF Ascii(Substr(s_str,i,1))>47 AND Ascii(Substr(s_str,i,1))<58 THEN Concat( s_out, Substr(s_str, i, 1) ); ELSE continue; END IF; END LOOP; return s_out; END;
试试这个 用你的实际的用户名替换scott CREATE OR REPLACE FUNCTION scott.fmtstr ( s_str IN VARCHAR2 ) RETURN VARCHAR2 IS i INTEGER; s_out VARCHAR2(36); BEGIN FOR i IN 1..Length(s_str) LOOP IF Ascii(Substr(s_str,i,1))>47 AND Ascii(Substr(s_str,i,1))<58 THEN Concat( s_out, Substr(s_str, i, 1) );
END IF; END LOOP; return s_out; END; 你的Concat也是一个function吧。我把他注释了条的
不行哦,还是报用样的错误哦 Warning: Function created with compilation errors concat是oracle的内部函数来的 是不是sqlplus / @test.sql就已经包括编译和创建了? test.sql就是包括以上内容
是不是sqlplus / @test.sql就已经包括编译和创建了?:不是这里的问题你是create or replace,他会自动覆盖以前的function, 我觉得问题肯定处在concat函数上。我的oracle是8.0.6版本的,不能调试这个function,你仔细检查一下concat函数。用这条语句差一下function是不是可用的: select object_name,object_type,status from user_objects where object_type='FUNCTION' and object_name='FMTSTR'
从PL/SQL2.1开始,如果独立的或打包的存储函数满足一些条件,可以在SQL语句中调用:
1。函数不能修改任何数据库表(8I中有所放宽)
2。为实现远程连接,函数不能读或写包变量的值
3。从SELECT,VALUES,SET子句执行的函数调用可以写包变量,其他所有子句中的函数必须是WNPS纯层
4。不能从CREATE TABLE或ALTER TABLE命令的CHECK子句调用该存储函数,也不能用来说明列的默认值
除此以外,用户定义的函数还必须满足下面的要求才能实现从SQL语句中的调用
1。只能用IN参数,不能用IN或 IN OUT
2。形参只能是数据库类型,不能使用PL/SQL类型,如BOOLEAN或RECORD
3。返回类型必须是数据库类型
4。不能使用COMMIT或ROLLBACK
5。不能提交任何ALTER SESSION或ALTER SYSTEM命令
我创建完函数之后,调用时报错
ERROR at line 1:
ORA-06575: Function FMTSTR is in an invalid state
请问什么原因?怎样解决?
select object_name,object_type,status from user_objects where object_type='FUNCTION' and object_name='TESTZYZ'
那我怎样知道编译过程中出了哪些错?我现在一重新创建,只报一句
Warning: Function created with compilation errors.
用客户端工具进行调试比较方便,如:rapidsql或navigator等。
CREATE OR REPLACE FUNCTION fmtstr ( s_str IN VARCHAR2 )
RETURN VARCHAR2
IS
i INTEGER;
s_out VARCHAR2(36);
BEGIN
FOR i IN 1..Length(s_str) LOOP
IF Ascii(Substr(s_str,i,1))>47 AND Ascii(Substr(s_str,i,1))<58
THEN
Concat( s_out, Substr(s_str, i, 1) );
ELSE
continue;
END IF;
END LOOP;
return s_out;
END;
用你的实际的用户名替换scott
CREATE OR REPLACE FUNCTION scott.fmtstr ( s_str IN VARCHAR2 )
RETURN VARCHAR2
IS
i INTEGER;
s_out VARCHAR2(36);
BEGIN
FOR i IN 1..Length(s_str) LOOP
IF Ascii(Substr(s_str,i,1))>47 AND Ascii(Substr(s_str,i,1))<58
THEN
Concat( s_out, Substr(s_str, i, 1) );
END IF;
END LOOP;
return s_out;
END;
你的Concat也是一个function吧。我把他注释了条的
Warning: Function created with compilation errors
concat是oracle的内部函数来的
是不是sqlplus / @test.sql就已经包括编译和创建了?
test.sql就是包括以上内容
我觉得问题肯定处在concat函数上。我的oracle是8.0.6版本的,不能调试这个function,你仔细检查一下concat函数。用这条语句差一下function是不是可用的:
select object_name,object_type,status from user_objects where object_type='FUNCTION' and object_name='FMTSTR'
s_out=concat( s_out, substr( s_str,i,1) );
提醒一下,你的函数只会返回空值NULL