我需要写一个存储过程,其中v_where(VARCHAR2)是我构造的查询条件语句,也就是sql语句的where语句,我这样写这个查询语句有没有问题?select * from ms_test
v_where;谢谢大家哦.

解决方案 »

  1.   

    你都自己构件好了,在里面运行不就知道了。
    create procedure v_where2(where1 varchar2)
    is
    stat varchar2(100);
    begin
    stat:='select * from emp '||where1;
    execute immediate stat;
    end;
    /
    不到这个语句行不行
      

  2.   

    我的意思是说我就直接这么写,比如v_where 为 where (id = '1')
    而我的语句就是
    select * from ms_test
    v_where;
    这样有没有语法错误?
      

  3.   

    CREATE OR REPLACE PROCEDURE IM.pro_allclassselect_test (p_collegelist IN VARCHAR2,p_name IN VARCHAR2)
    IS
      v_substr       varchar2(100);    --子串长度根据程序需要修改
      v_pos1         integer;
      v_pos2         integer;
      v_num          integer;
      v_where        varchar2(1000);    --用于存储动态的where语句
      v_save_class   varchar2(400);    --用于存储p_name对应的classpower
      sql_string     varchar2(1500);   --用于构造的SQL语句
    BEGIN
      v_pos1 := 1;
      v_num := 1;
      v_where := '';
      v_save_class := '';
      sql_string := '';
      select classpower INTO v_save_class FROM MS_POWER WHERE adminname = p_name;   --得到需要分割的班级信息 
      WHILE (INSTR(p_collegelist,'.',v_pos1+1) <> 0) LOOP
            v_pos2 := INSTR(p_collegelist,'.',v_pos1+1);
            IF v_num = 1 
            THEN
               IF (INSTR(p_collegelist,'.',v_pos1,v_num) = 1)
               THEN
                  v_substr := SUBSTR(p_collegelist,v_pos1+1,v_pos2-1);
               ELSE
                  v_substr := SUBSTR(p_collegelist,v_pos1,v_pos2-1);
               END IF;
            ELSE
                v_substr := SUBSTR(p_collegelist,v_pos1+1,v_pos2-v_pos1-1);
            END IF;
            v_where := v_where ||'( where collegename ='||v_substr||') or';  --没有到最后,所以有or
            v_num := v_num + 1;
            v_pos1 := v_pos2;
      END LOOP;
      v_substr := SUBSTR(p_collegelist,v_pos1+1);
      IF v_save_class is null   --如果班级的序列为空 
      THEN
      v_where := v_where ||'( where collegename ='||v_substr||')';  --到最后,还是没有or,因为没有了班级信息
      ELSE
      v_where := v_where ||'( where collegename ='||v_substr||') or';  --到最后,还是有or,因为有了班级信息    
      END IF;
      IF v_save_class is not null   --如果班级序列不为空
      THEN
      v_pos1 := 1;    --指针复位
      v_num := 1;
      WHILE (INSTR(v_save_class,'.',v_pos1+1) <> 0) LOOP
            v_pos2 := INSTR(v_save_class,'.',v_pos1+1);
            IF v_num = 1 
            THEN
               IF (INSTR(v_save_class,'.',v_pos1,v_num) = 1)
               THEN
                  v_substr := SUBSTR(v_save_class,v_pos1+1,v_pos2-1);
               ELSE
                  v_substr := SUBSTR(v_save_class,v_pos1,v_pos2-1);
               END IF;
            ELSE
                v_substr := SUBSTR(v_save_class,v_pos1+1,v_pos2-v_pos1-1);
            END IF;
            v_where := v_where ||'( where classname ='||v_substr||') or';  --没有到最后,所以有or
            v_num := v_num + 1;
            v_pos1 := v_pos2;
      END LOOP;
      v_substr := SUBSTR(v_save_class,v_pos1+1);
      v_where := v_where ||'( where classname ='||v_substr||')';  --到最后,没有or
      END IF;
      --注意除去重复列,DISTINCT
      sql_string := 'SELECT DISTINCT * FROM MS_CLASSINFO' || v_where; --构件的sql语句
      execute immediate sql_string;
    END pro_allclassselect_test;
      

  4.   

    sql_string := 'SELECT DISTINCT * FROM MS_CLASSINFO' || v_where; --构件的sql语句
      execute immediate sql_string;自己不是写出来了吗?还有什么问题?
      

  5.   

    之前的问题已经解决了,但是我这样改了以后不知道为什么有问题..
    CREATE OR REPLACE PROCEDURE IM.pro_allclassselect (p_collegelist IN VARCHAR2,p_name IN VARCHAR2,p_CURSOR OUT pro_allclassselect_PACKAGE.pro_allclassselect_CURSOR)
    IS
      v_substr       varchar2(100);    --子串长度根据程序需要修改
      v_pos1         integer;
      v_pos2         integer;
      v_num          integer;
      v_where        varchar2(1000);    --用于存储动态的where语句
      v_save_class   varchar2(400);    --用于存储p_name对应的classpower
      sql_string     varchar2(1500);   --用于构造的SQL语句
    BEGIN
      v_pos1 := 1;
      v_num := 1;
      v_where := '';
      v_save_class := '';
      sql_string := '';
      select classpower INTO v_save_class FROM MS_POWER WHERE adminname = p_name;   --得到需要分割的班级信息 
      WHILE (INSTR(p_collegelist,'.',v_pos1+1) <> 0) LOOP
            v_pos2 := INSTR(p_collegelist,'.',v_pos1+1);
            IF v_num = 1 
            THEN
               IF (INSTR(p_collegelist,'.',v_pos1,v_num) = 1)
               THEN
                  v_substr := SUBSTR(p_collegelist,v_pos1+1,v_pos2-1);
               ELSE
                  v_substr := SUBSTR(p_collegelist,v_pos1,v_pos2-1);
               END IF;
            ELSE
                v_substr := SUBSTR(p_collegelist,v_pos1+1,v_pos2-v_pos1-1);
            END IF;
            v_where := v_where ||'(collegename ='''||v_substr||''') or';  --没有到最后,所以有or
            v_num := v_num + 1;
            v_pos1 := v_pos2;
      END LOOP;
      v_substr := SUBSTR(p_collegelist,v_pos1+1);
      IF v_save_class is null   --如果班级的序列为空 
      THEN
      v_where := v_where ||'(collegename ='''||v_substr||''')';  --到最后,还是没有or,因为没有了班级信息
      ELSE
      v_where := v_where ||'(collegename ='''||v_substr||''') or';  --到最后,还是有or,因为有了班级信息    
      END IF;
      IF v_save_class is not null   --如果班级序列不为空
      THEN
      v_pos1 := 1;    --指针复位
      v_num := 1;
      WHILE (INSTR(v_save_class,'.',v_pos1+1) <> 0) LOOP
            v_pos2 := INSTR(v_save_class,'.',v_pos1+1);
            IF v_num = 1 
            THEN
               IF (INSTR(v_save_class,'.',v_pos1,v_num) = 1)
               THEN
                  v_substr := SUBSTR(v_save_class,v_pos1+1,v_pos2-1);
               ELSE
                  v_substr := SUBSTR(v_save_class,v_pos1,v_pos2-1);
               END IF;
            ELSE
                v_substr := SUBSTR(v_save_class,v_pos1+1,v_pos2-v_pos1-1);
            END IF;
            v_where := v_where ||'(classname ='''||v_substr||''') or';  --没有到最后,所以有or
            v_num := v_num + 1;
            v_pos1 := v_pos2;
      END LOOP;
      v_substr := SUBSTR(v_save_class,v_pos1+1);
      v_where := v_where ||'(classname ='''||v_substr||''')';  --到最后,没有or
      END IF;
      --注意除去重复列,DISTINCT
      sql_string := 'OPEN p_CURSOR FOR SELECT DISTINCT * FROM MS_CLASSINFO WHERE' || v_where; --构件的sql语句
      --dbms_output.PUT_LINE(sql_string);    --bebug
      execute immediate sql_string;
    END pro_allclassselect;
      

  6.   

    也就是这一句
    sql_string := 'OPEN p_CURSOR FOR SELECT DISTINCT * FROM MS_CLASSINFO WHERE' || v_where; --构件的sql语句
      --dbms_output.PUT_LINE(sql_string);    --bebug
      execute immediate sql_string;
      

  7.   

    应该这样用:
    sql_string := ...;
    open cursor for sql_string;