这个不好说了,你找一本pl/sql的书看看

解决方案 »

  1.   

    create or replace procedure ac_switch(oac in number,nac in number)
    as 
      l_change_sw number(3);
      l_change_it varchar2(1);
      cursor ac_cur
      is
      select distinct pref_3 from phone_nbr
      where area_code = oac;
      begin
         for ac_rec in ac_cur
         loop
         l_change_it := 'N';
         begin
            select '' into l_change_sw
            from static_exc
            where area code = oac
            and pref_3 = ac_rec.pref_3;
         exception
            when no_data_found then
              l_change_it := 'Y';
         end;
         if l_change_it = 'Y' then
             update phone_nbr set area_code = nac
             where area_code = oac
             and pref_3 = ac_rec.pref_3;
         end if;
         end loop;
      end;
    /
      

  2.   

    create or replace procedure prc_char_to_varchar2(prm_tablename IN VARCHAR2, prm_return OUT VARCHAR2) is
       /*-------------------------------------------------------------------------*/
       /* 公用过程函数描述                                                        */
       /*-------------------------------------------------------------------------*/
       /*-------------------------------------------------------------------------
       || 函数名称 :将CHAR字段转换为VARCHAR2型
       || 功能描述 :将表中CHAR字段转换为VARCHAR2型,并对转换的字段做TRIM()
       ||
       || 参数描述 :参数标识         名称              输入输出    类型
       ||            -------------------------------------------------------------
       ||            prm_tablename    表名              输入        VARCHAR2,
       ||
       || 返回值:   Result           执行结果          返回        VARCHAR2,-------------------------------------------------------------------------*/  Result VARCHAR2(32);
      CURSOR c_col IS
          SELECT column_name, data_length, nullable FROM cols WHERE table_name = upper(prm_tablename) AND data_type = 'CHAR' ORDER BY column_id;  s_alter_sql VARCHAR2(4000) := '';
      s_update_sql VARCHAR2(4000) := '';
      s_alter_execute_sql VARCHAR2(4000);
      s_update_execute_sql VARCHAR2(4000);
      s_nullable VARCHAR2(32);
      n_cursor     NUMBER ;
      i_return     INTEGER;
      i_columns    INTEGER := 0;
    begin
      FOR rec_col IN c_col LOOP
          IF rec_col.nullable = 'Y' THEN
             s_nullable := '';
          ELSE
             s_nullable := ' NULL';
          END IF;
          s_alter_sql := s_alter_sql || rec_col.column_name || ' VARCHAR2(' || rec_col.data_length ||')' || s_nullable || ',';
          s_update_sql := s_update_sql || rec_col.column_name || '=TRIM(' || rec_col.column_name ||'),';
          i_columns := i_columns + 1;
      END LOOP;  IF i_columns = 0 THEN
          prm_return := '0';
          RETURN;
      END IF;
      s_alter_execute_sql := 'ALTER TABLE ' || prm_tablename || ' MODIFY(' || substr(s_alter_sql, 1, length(s_alter_sql) - 1) || ')';
      s_update_execute_sql := 'UPDATE ' || prm_tablename || ' SET ' || substr(s_update_sql, 1, length(s_update_sql) - 1);   --dbms_output.put_line(s_alter_execute_sql);
       n_cursor := DBMS_SQL.OPEN_CURSOR;
       DBMS_SQL.PARSE ( n_cursor, s_alter_execute_sql, DBMS_SQL.V7 );
       i_return := DBMS_SQL.EXECUTE( n_cursor );
       DBMS_SQL.CLOSE_CURSOR ( n_cursor );   --dbms_output.put_line(s_update_execute_sql);
       n_cursor := DBMS_SQL.OPEN_CURSOR;
       DBMS_SQL.PARSE ( n_cursor, s_update_execute_sql, DBMS_SQL.V7 );
       i_return := DBMS_SQL.EXECUTE( n_cursor );
       DBMS_SQL.CLOSE_CURSOR ( n_cursor );
       COMMIT;   prm_return := i_columns || ' | ' || i_return;
       RETURN;
    end prc_char_to_varchar2;
      

  3.   

    最好用PL/SQL Developer这个小东东进行开发、调试。非常方便。