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

解决方案 »

  1.   

    存储过程不能用在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命令
      

  2.   

    thank you everybody, next question
    我创建完函数之后,调用时报错
    ERROR at line 1:
    ORA-06575: Function FMTSTR is in an invalid state
    请问什么原因?怎样解决?
      

  3.   

    你的function FMTSTR处于INVALID状态,是由于你最后一次编译时有错误导致的。从新编译成功就可以用了。可以运行改语句查询他所处的状态:
    select object_name,object_type,status from user_objects where object_type='FUNCTION' and object_name='TESTZYZ'
      

  4.   

    TO zhaoyongzhu
    那我怎样知道编译过程中出了哪些错?我现在一重新创建,只报一句
    Warning: Function created with compilation errors.
      

  5.   

    上面显示你的function编译过程中发生错误:
    用客户端工具进行调试比较方便,如:rapidsql或navigator等。
      

  6.   

    把你的function贴出来,我帮你调。
      

  7.   

    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;
      

  8.   

    试试这个
    用你的实际的用户名替换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吧。我把他注释了条的
      

  9.   

    不行哦,还是报用样的错误哦
    Warning: Function created with compilation errors
    concat是oracle的内部函数来的
    是不是sqlplus / @test.sql就已经包括编译和创建了?
    test.sql就是包括以上内容
      

  10.   

    是不是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'
      

  11.   

    thank you, OK了,我自己调完了,需要以下才行
    s_out=concat( s_out, substr( s_str,i,1) );
      

  12.   

    ipcs(solar) 
    提醒一下,你的函数只会返回空值NULL