给你一个相似的例子  
 PROCEDURE save_acc_instant_stk(p_product  IN NUMBER,
                                  p_store    IN INTEGER,
                                  p_account  IN NUMBER,
                                  p_quantity IN INTEGER) IS
   BEGIN
      MERGE INTO t_store_acc_instant_stock d
      USING (SELECT p_product  AS product_no,
                    p_store    AS store_no,
                    p_account  AS account_no,
                    p_quantity AS quantity
               FROM dual) s
      ON (d.product_no = s.product_no AND d.store_no = s.store_no AND d.account_no = s.account_no)
      WHEN MATCHED THEN
         UPDATE SET d.quantity = d.quantity + s.quantity
      WHEN NOT MATCHED THEN
         INSERT
            (d.product_no, d.store_no, d.account_no, d.quantity)
         VALUES
            (s.product_no, s.store_no, s.account_no, s.quantity);
   END save_acc_instant_stk;

解决方案 »

  1.   

    楼主的存储过程是SQL SERVER语法
    在oracle中当然不能用拉
      

  2.   

    create or replace PROCEDURE CARINFO
    (p_CARID IN NUMBER,p_CAR_CLASS IN NUMBER,p_CAR_MARK IN NUMBER)    
     IS
       BEGIN
          MERGE INTO CAR_INFO d
          USING (SELECT p_CARID AS CARID,
                        p_CAR_CLASS  AS CAR_CLASS  ,
                        p_CAR_MARK AS CAR_MARK 
                  FROM dual) s
          ON (d.CARID= s.CARIDAND )
          WHEN MATCHED THEN
             UPDATE SET d.CARID=12,d.CAR_CLASS=13,d.CAR_MARK=14
          WHEN NOT MATCHED THEN
             INSERT
                (d.CARID, d.CAR_CLASS, d.CAR_MARK)
             VALUES
                (s.CARID, s.CAR_CLASS, s.CAR_MARK);
       END CARINFO;
    --你测试一下
      

  3.   

    if( SELECT * FROM CAR_INFO WHERE CARID=@CARID)不对的
    rCnt number;
    SELECT count(1) into rCnt FROM CAR_INFO WHERE CARID=@CARID
    if( rCnt >0) then 
    ...
    else
    ...
    end if;
      

  4.   

    icedut(冰) 我是在PL/SQL下面 编译的
    EXECUTE CAR_INFO 10,20,30,50这句还是説无效的SQL语句
      

  5.   

    begin
    CAR_INFO 10,20,30,50;
    end;--应该这样执行吧
      

  6.   

    执行存储过程不用加execute
    直接写名字就好
      

  7.   

    你也可以不用merge
    用doer_ljy(可战) ( ) 的方法SELECT count(1) into rCnt FROM CAR_INFO WHERE CARID=@CARID  --oracle中不用@
      

  8.   


    FROM dual
    dual应该改成我的表名吧  
    第一次写存储过程不好意思
      

  9.   

    我的数据来自外部(vc调用存储过程)MERGE INTO 可以用吗