1,大家都知道  sql语句后面的where子句一般都形如:where  a=1;
如果从前台用户已经把  a=1   当做一整个表达式传入存储过程进行处理
该怎么写?
--expre=(a=1);
我这样写有错
create or pelace procedure mypro(expre in varchar2)
as
begin
....
....  where expre
oracle报条件表达式错误  编译不通过
2.如何用存储过程实现:
检查某一个表是否存在某一列 ,如果不存在 ,就创建
 

解决方案 »

  1.   

    SQL> select * from t1;        ID NAME
    ---------- ----------
             1 aa
             2 bb
    SQL> create or replace procedure mypro(expre in varchar2)
      2  as
      3  result varchar2(40);
      4  v_name varchar2(40);
      5  begin
      6  result:='select name from t1 where '||expre;
      7  execute immediate result into v_name;
      8  dbms_output.put_line(v_name);
      9  end;
     10  /Procedure created.
    SQL> set serveroutput on
    SQL> exec mypro('id=1')
    aaPL/SQL procedure successfully completed.
    SQL> exec mypro('id=2')
    bbPL/SQL procedure successfully completed.
      

  2.   

    SQL> desc t1
     Name                                      Null?    Type
     ----------------------------------------- -------- ---------------------------- ID                                                 NUMBER
     NAME                                               VARCHAR2(10)
    SQL> create or replace procedure mypro(t_name in varchar2,col_name in varchar2,c
    ol_type in varchar2)
      2  as
      3  flag number;
      4  cmd varchar2(40);
      5  begin
      6  select count(*) into flag
      7  from all_tab_columns
      8  where owner='SCOTT' and
      9  table_name=t_name and
     10  column_name=col_name;
     11  if flag=0 then
     12  cmd:='alter table '||t_name||' add ('||col_name||' '||col_type||')';
     13  execute immediate cmd;
     14  end if;
     15  end;
     16  /Procedure created.
    SQL> exec mypro('T1','SEX','varchar2(10)') --sex列不存在 因此存储过程执行完添加了相应列PL/SQL procedure successfully completed.SQL> desc t1
     Name                                      Null?    Type
     ----------------------------------------- -------- ---------------------------- ID                                                 NUMBER
     NAME                                               VARCHAR2(10)
     SEX                                                VARCHAR2(10)
    SQL> exec mypro('T1','ID','number')  --id列已经存在 所以并没有添加列 PL/SQL procedure successfully completed.
    SQL> desc t1
     Name                                      Null?    Type
     ----------------------------------------- -------- ---------------------------- ID                                                 NUMBER
     NAME                                               VARCHAR2(10)
     SEX                                                VARCHAR2(10)
      

  3.   

    这两个问题都用动态的SQL来实现!
      

  4.   

    execute immediate 可以解决条件已写,条件某个参数是 in 的问题
      

  5.   

    一楼正解。
    关键是使用动态SQL技术。Oracle数据库开发常用的技术,而且必须要用好的。