create table lshtemp(LSH nvarchar2(50));create table t1(maxno number);create or replace procedure pro_BH6
(
       BHKey in varchar2,
       TableName in varchar2,
       n out number
)
as
begin
     declare
      sqlstr varchar2(200):='SELECT MAX(to_binary_double(SUBSTR(:1,9,3)))+1  FROM '||TableName;      
      cnt t1%rowtype;    
    begin
        EXECUTE IMMEDIATE sqlstr
               into cnt
               using BHKey;
       n:=cnt.maxno;
       DBMS_OUTPUT.put_line(cnt.maxno);
      
       DBMS_OUTPUT.put_line(sysdate);
    end;     
end;
以上代码在PL/SQL 中成功运行创建了存储过程pro_BH6
并且有效,测试pro_BH6时BHKey为LSH,TableName为lshtemp
但是结果
DBMS_OUTPUT.put_line(cnt.maxno);这行输出空,不知道哪儿有问题?求高手指导

解决方案 »

  1.   


    --如果把你的sql语句拆分了,是下面这样的情况;
    --你怎么能够把一个binary_double值赋给表名呢?
    SELECT MAX(to_binary_double(SUBSTR(:1,9,3)))+1  into table_name
    FROM TableName;
      

  2.   

    哦,是的,那怎么样把'SELECT MAX(to_binary_double(SUBSTR(:1,9,3)))+1 FROM '||TableName;
    这个语句执行结果的值取出来呢?我的目的就是要取出这个值 
      

  3.   


    create or replace procedure pro_BH6(
           BHKey in varchar2,
           TableName in varchar2,
           n out number)
    as
      sqlstr varchar2(200):='SELECT MAX(to_binary_double(SUBSTR(:1,9,3)))+1 FROM '||TableName;   
      cnt number;--这里定义一个number变量就可以了
    begin
          EXECUTE IMMEDIATE sqlstr
          into cnt --这里赋值
          using BHKey;
          n:=cnt;
          DBMS_OUTPUT.put_line(cnt);
          DBMS_OUTPUT.put_line(sysdate);   
    end pro_BH6;
      

  4.   

    Oh,Yeah!搞定了,谢谢BOBO12082119这位帅哥了,非常感谢!绑定参数错了
    sqlstr varchar2(200):='SELECT MAX(to_binary_double(SUBSTR('||BHKey||',9,3)))+1  FROM '||TableName;应该这样拼接BHKey。
    呵呵,是在输入错误的表名时提示无该对象,但是输入错误的BHKey时没有提示,就想到在查动态SQL的资料时提到过绑定参数来传递SQL模式对象是不行的,要直接把参数嵌套在字符串中。