1、像select columnName into :value1 from tableName where ...  这样的语法
   如何检查select返回返回了0行,或者多于1行??
2、plsql中的case when then 语句 when节中能否包含多个或者连接值,或可以达到相同目的的语法,谢谢
   例如 case v_value1
          when 1 or 2 or 3 then
        end case

解决方案 »

  1.   

    SELECT CASE  WHEN 1 IN (1, 2,3) THEN 123
    ELSE 0 END FROM dual--
    123
      

  2.   

    SQL%ROWCOUNT  表示记录数例子
    v_sql :=
             'UPDATE t_store_in_instructions SET instruction_status = :p1 WHERE instruction_no = :p2 AND instruction_status = :p3';      EXECUTE IMMEDIATE v_sql
                      USING c_finish_status, p_ins, c_default_status;      IF SQL%ROWCOUNT = 0   --当没有更新的记录时抛出异常
          THEN
             RAISE_APPLICATION_ERROR (-20002, TO_CHAR (p_ins), FALSE);
          END IF;
      

  3.   

    SQL%ROWCOUNT表示当前cursor已经返回的记录数
      

  4.   

    谢谢楼上两位
    又出现两个问题声明了一个rowtype变量 v_value1 tableName%Rowtype;
    1. 如何用select 为v_value1赋值?
        我用 select * into :v_value1 from tabelName where... 报错
    2、如果v_value1赋值没成功,
        如何判断rowtype类型变量中没赋值?
        又如何使rowtype类型变量中的值恢复为没赋值状态,用null判断可以吗?
    3、rowtype类型的变量可以放在游标中吗?谢谢!!!
      

  5.   

    DECLARE rowarea B_AREAS%ROWTYPE;
    BEGIN
    SELECT * INTO rowarea FROM B_AREAS WHERE area_id='M';
    END;
      

  6.   

    1. 如何用select 为v_value1赋值?
        我用 select * into :v_value1 from tabelName where... 报错
    加了:是什么意思,难道是绑定变量2、如果没有记录
       会抛出异常3、rowtype类型的变量可以放在游标中吗?
    没看懂是什么意思
      

  7.   

    哦,因为初用plsql,问题描述肯定不够专业,看不懂是正常的 -_-解释一下
    1、
    declare v_row1 tableName@rowtype;
    begin
       select * into v_row1 from tableName where...
    end如果这个select没返回行,这时候并不人为抛出异常,而是继续执行过程,但是当后面用到v_row1时候,如果判断v_row1中有没有值呢??如果select成功了,后面的程序由于某种需要想使v_row1恢复成未赋值之前的状态,如何做呢??2、如果用参数传入一个值,这个值用在where中,希望使用绑定变量(以减少硬解析),如何写呢??
       另外into后面的变量列表,是否使用绑定变量??谢谢
      

  8.   

    再请教一个问题,
    SELECT CASE  WHEN 1 IN (1, 2,3) THEN 123
    ELSE 0 END FROM dual这种语法是否支持 多个when的情况
    例如
    select case 
             when v_value1 in (1,2,3) then
                ......
             when v_value1 in (10,11,12) then
                ......
            end
    from dual;我像上面那样写了,但是报错
    如果不支持,请教是否还有其它支持像下面这种目的的语法格式
    case value1
       when 1 or 2 or 3 then
       when 10 or 11 or 12 then
       else
    end case;
    谢谢
      

  9.   

    SELECT CASE  WHEN 1 IN (1, 2,3) THEN 123
    WHEN 1 IN (4,5,6) THEN 456
    ELSE 0 END FROM dual--执行没有问题
    解释一下
    1、
    declare v_row1 tableName@rowtype;
    begin
       select * into v_row1 from tableName where...
    end如果这个select没返回行,这时候并不人为抛出异常,
    --系统会抛出异常
      你要处理的
      

  10.   


    2、如果用参数传入一个值,这个值用在where中,希望使用绑定变量(以减少硬解析),如何写呢??v_sql :=
             'UPDATE t_store_in_instructions SET instruction_status = :p1 WHERE instruction_no = :p2 AND instruction_status = :p3';      EXECUTE IMMEDIATE v_sql
                      USING c_finish_status, p_ins, c_default_status;  --这个例子中p1,p2,p3 都是绑定的变量
      

  11.   

    谢谢1、
    SELECT CASE  WHEN 1 IN (1, 2,3) THEN 123
    WHEN 1 IN (4,5,6) THEN 456
    ELSE 0 END FROM dual
    --执行没有问题我的意思是then后是一段plsql代码,也可以吗?我这里是报错的2、
    declare v_row1 tableName@rowtype;
    begin
       select * into v_row1 from tableName where...
    end如果这个select没返回行,这时候并不人为抛出异常,
    --系统会抛出异常
      你要处理的请教,抛出异常是会转到异常处理段吗?
    exception
    when others then但是游标不会转到异常处理段,通过判断%NotFound跳出取值循环3、关于绑定变量我是这么写的,看了本书,这是书上的语法,但是报错
    create or replace function F_function1
    (
       p_para1 in Varchar

    return number is
       Variable v_value1 Varchar2(10);
       v_value2 Varchar2(100);
    begin
       :v_value1 := p_para1;
       select column2 into v_value2 from tableName where column1=:v_value1;   return.....
    end;