精华内容
下载资源
问答
  • 存储过程不好调试,无法移植,这是大家的共识,没改善空间了。 原来存储过程是“不得不用”,因为前端的报表工具不具备复杂计算能力,而为报表准备数据的逻辑又很复杂,用存储过程方便些。 但存储过程的缺点实在...

    存储过程不好调试,无法移植,这是大家的共识,没啥改善空间了。

    原来存储过程是“不得不用”,因为前端的报表工具不具备复杂计算能力,而为报表准备数据的逻辑又很复杂,用存储过程方便些。

    但存储过程的缺点实在太多,除了不好调试,没法扩展,无法移植,还容易造成报表应用跟数据库的高耦合,改报表就得去数据库里创建 / 修改存储过程。

    现在大家比较倾向于用 JAVA 硬编码来做复杂计算,但复杂度太高了,对于报表开发来说就要很多高级程序员参与才行,不太划算。

    另外一个选择是使用带脚本计算能力的报表工具,在报表里就直接搞定原来存储过程的那些计算(库外存储过程),而且相对简单,原来的报表开发人员就都能搞定。
    画了一个简图,可以感受一下:

    png

    新型报表应用结构中,存储过程挪到库外做了以后,数据库还是要承担一点计算任务的,比如过滤、分组之类,主要是为了减少取数的 IO 消耗。

    这里详细介绍了带脚本计算能力的报表工具如何完成库外存储过程,供参考: 怎样减少报表开发中对存储过程的依赖

    展开全文
  • exec调用带output输出参数的存储过程,想要得到输出参数的值,必须在调用参数后面加output关键字,如:  declare @value int  exec up_test 2,3,@value output  print @value  这样@value才会值,...

       用exec调用带有output输出参数的存储过程,想要得到输出参数的值,必须在调用参数后面加output关键字,如:

      declare @value int

      exec up_test    2,3,@value output

      print @value

      这样@value才会有值,如果没有output啥都print不出来

    展开全文
  • oracle存储过程

    2018-01-02 14:45:04
    怎么:用户通过指定存储过程的名字并给出参数(如果该存储过程参数)来执行它。优点的?:存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程存储过程是由流控制和...

    什么是:存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中。

    怎么用:用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

    优点啥的?:存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。 存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。在Oracle 中,若干个有联系的过程可以组合在一起构成程序包。


    存储过程的创建

    使用命令语法如下:

     DROP PROCEDURE IF EXISTS add_gslb();//如果存在就删除
    
     CREATE [OR REPLACE] 
     DEFINER=`root`@`localhost` 
     PROCEDURE add_gslb(INOUT p_inout int)// 为某个用户和密码 创建存储过程。
    下图是员工表: 我们用存储过程来修改员工信息,

    job为CLERK的工资增加10%,

    job为SALESMAN的工资增加20%,

    job为ANALYST的工资增加30%,其他员工工资不变,失败则回滚。


        create or replace procedure update_sal  
        as  
          --根据主键进行修改  
          u_sal number(7,2) := 0;--修改后的工资  
        begin  
               for dump in(select job,empno,sal from emp) loop  
                  case  
                        when dump.job = 'CLERK' then  
                             u_sal := dump.sal*1.1;  
                        when dump.job = 'SALESMAN' then  
                             u_sal := dump.sal*1.2;  
                        when dump.job = 'ANALYST' then  
                             u_sal := dump.sal*1.3;  
                        else  
                             u_sal := dump.sal;  
                  end case;  
                  update emp t set t.sal = u_sal where t.empno = dump.empno;  
               end loop;  
               commit;  
               exception when others then  
               rollback;  
        end;  

    写一个带参数的存储过程,如果执行成功,返回1,失败则返回0,代码如下:

        create or replace procedure   
        do_insert_dept(dept_name in varchar2,  
        dept_loc in varchar2,is_success out number)  
        as  
        begin  
                 insert into dept(deptno,dname,loc)  
                 values(scott_squence.nextval,dept_name,dept_loc);  
                 commit ;  
                 is_success := 1;  
                 exception when others then  
                 rollback;  
                 is_success:=0;  
        end do_insert_dept;  

    过程中参数必须符合规范,在一个存储过程中可以传递也可以不传递参数,可以传递一个或者多个参数,和函数是一样,参数的类型有三种:
    ·in:表示执行过程传入的参数
    ·out:表示执行过程返回的参数
    ·in out:表示即可以作为传入的参数,也可以作为返回的参数(不建议使用的)
    如果在参数中,定义一个out,一般的开发中,在没有异常发送的情况下,返回1,否则返回0。


    使用存储过程的优点:
    (1)减少网络通信量。简单的存储过程和简单的sql语句没有很大的差别,可是如果存储过程包含上百行SQL语句,那么其性能绝对比一条一条的调用SQL语句要高得多。 

    (2)执行速度更快(已编译)。有两个原因:首先,在存储过程创建的时候,数据库已经对其进行了一次解析和优化。其次,存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调用。 

    (3)更强的适应性():由于存储过程对数据库的访问是通过存储过程来进行的,因此数据库开发人员可以在不改动存储过程接口的情况下对数据库进行任何改动,而这些改动不会对应用程序造成影响。 

    (4)分布式工作:应用程序和数据库的编码工作可以分别独立进行,而不会相互压制。 
    使用存储过程的缺点:
    (1)可移植性差

    (2)如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,这时候操作就比较繁琐了


    附带java中调用存储过程代码:使用

    CallableStatement //进行调用 

        public class JDBCTest {  
            //定义数据库驱动程序类  
            public static final String DRIVER = "oracle.jdbc.driver.OracleDriver";  
            //定义数据库连接池  
            public static final String URL = "jdbc:oracle:thin:@localhost:1521:ceshi";  
            //数据库用户  
            public static final String DBNAME = "scott";  
            //用户密码  
            public static final String PASSWORD = "1111";  
              
            public static void main(String[] args) {  
                Connection conn = null;  
                CallableStatement calls = null;  
                //是用来调用过程和函数的操作接口  
                try {  
                    //使用反射机制加载驱动程序  
                    Class.forName(DRIVER);  
                    //取得连接  
                    conn = DriverManager.getConnection(URL, DBNAME, PASSWORD);  
                    String sql = "{call do_insert_dept(?,?,?)}";  //调用的sql
                    calls= conn.prepareCall(sql);//取得操作对象  
                    calls.setString(1,"技术部");  //设置参数
                    calls.setString(2,"山西太原");  //设置参数
                    calls.registerOutParameter(3, java.sql.Types.INTEGER);//注册返回类型  
                    calls.execute();//执行  
                    int returnNum = cstate.getInt(3);//取得返回结果  
                    System.out.println(returnNum);  
                  
                } catch (Exception e) {  
                    e.printStackTrace();//打印异常  
                } finally{  
                    try {  
                        calls.close();  
                        conn.close();//连接关闭  
                    } catch (Exception ex) {  
                        ex.printStackTrace();  
                    }  
                }  
            }  
        }  



    原文地址:http://blog.csdn.net/weixin_36380516/article/details/68576444

    展开全文
  • 问:为用存储过程?答:①将重复性很高的一些操作,封装到一个存储过程中。简化了对这些SQL的调用。②批量处理sql+循环③统一接口注意:mysql中,存储功能相对较弱。使用较少。二、基本建立语法例1:DELIMITER $...

    一、使用场景

    1.执行时简单:名字+参数

    2.存储过程中可以有一个、多个sql语句。

    问:为啥要用存储过程?

    答:

    ①将重复性很高的一些操作,封装到一个存储过程中。简化了对这些SQL的调用。

    ②批量处理sql+循环

    ③统一接口

    注意:mysql中,存储功能相对较弱。使用较少。

    二、基本建立语法

    例1:

    DELIMITER $$

    CREATE PROCEDURE delete_matches(IN p playerno INTEGER)

    BEGIN

    DELETE FROM MATCHES

    WHERE playerno=p_playerno;

    END$$

    DELIMITER;

    call delete_matches(6);

    例2:

    delimiter $$

    CREATE PROCEDURE dorepeat(p1 INT)

    BEGIN

    SET @x = 0; --》用set赋值, repeat循环

    REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;

    END$$

    delimiter ;

    CALL dorepeat(1000);

    SELECT @x;

    执行后:@x的值为1001

    @变量名字的作用:

    ①存储过程中定义,存储过程中进行处理,加减乘除。

    ②存储过程外面可以访问这个@变量,这个变量保存了存储过程中对这个变量处理后的值。

    @x:用户变量

    存储过程外面可以访问,一直被保存。

    直接使用set @x=0;就可以生成这么一个变量,不需要数据类型。

    三、存储过程参数

    三类:in(输入参数)、out(输出参数)、inout(输入和输出参数)

    存储过程需要是活的–》输入不同的参数,执行不同的操作,处理不同的行等等。

    IN参数

    DELIMITER $$

    CREATE PROCEDURE delete matches(IN p playerno INTEGER)

    BEGIN

    DELETE FROM MATCHES

    WHERE playerno=p_playerno;

    END$$

    DELIMITER;

    call delete_matches(6);

    IN参数可以是:数值100、赋值了的变量 set @a=100;

    OUT参数

    delimiter $$

    CREATE PROCEDURE simpleproc (OUT param1 INT)

    BEGIN

    SELECT COUNT(*) INTO param1 FROM PLAYERS;

    END$$

    delimiter ;

    CALL simpleproc(@a);

    SELECT @a;

    OUT参数:变量就可以,可以没有赋值。 @a

    INOUT参数

    delimiter $$

    CREATE PROCEDURE simpleproc1(INOUT param1 INT)

    BEGIN

    SELECT COUNT(*) INTO param1 FROM PLAYERS where PLAYERNO<=param1;

    END$$

    delimiter ;

    set @a=10;

    CALL simpleproc1(@a); --》调用存储过程时,只要引用变量就行!

    SELECT @a;

    INOUT参数:只能是赋了值得变量。 set @a=100;

    一个存储过程如果想有返回值:

    1.out参数

    2.inout参数

    3.在存储过程内部定义用户变量

    @变量名字

    建议:返回值使用out参数;输入值使用in参数。

    四、begin…end语法

    为什么需要begin…end?

    答:

    ①因为begin…end语句之间的n条语句属于一条语句,一个整体。

    ②成对出现。

    BEGIN

    sql语句

    END$$

    五、变量

    1.用户变量@

    随处可定义,随处可使用;

    不定义可直接使用;

    随处可见;

    内部定义,外部可见。

    2.局部变量,只有名字,没有@符号

    先定义,再使用;

    只在存储过程内部可见;只能定义在begin后面!

    注意:在存储过程内部,使用局部变量,不要使用用户变量。

    用户变量和局部变量的区别:

    ①局部变量前面没有@符号

    ②当begin…end块处理完后,局部变量就消失了,而用户变量存在于整个会话之中。

    定义局部变量:

    DECLARE 变量名字 类型 [default] –》而且declare必须紧接着begin!

    例:

    DECLARE var_name [, var_name] ... type [DEFAULT value]

    delimiter $$

    CREATE PROCEDURE sp1 (x VARCHAR(10))

    BEGIN

    DECLARE newname VARCHAR(10);

    DECLARE xid INT;

    SELECT xname, id INTO newname, xid

    FROM table1 WHERE xname = x;

    SELECT newname;

    END$$

    delimiter ;

    call sp1('a');

    初始化局部变量:

    delimiter $$

    CREATE PROCEDURE test1(OUT num1 INTEGER)

    BEGIN

    DECLARE num2 INTEGER DEFAULT (SELECT count(*) FROM PLAYERS);

    SET num1 = num2;

    END$$

    delimiter ;

    begin…end的作用域:

    外层看不到内层;

    内层可以看到外层;

    平行互相看不见。

    SET

    可以给用户变量和局部变量赋值

    用户变量内外都可以使用

    局部变量,只有begin end之间可以使用,而且需要declare定义

    六、IF…ELSE

    DELIMITER $$ --》定义$$为分界符

    CREATE PROCEDURE difference(

    IN p1 INTEGER, --》整数

    IN p2 INTEGER,

    OUT p3 INTEGER)

    BEGIN

    IF p1 > p2 THEN

    SET p3 = 1;

    ELSEIF p1= p2 THEN

    SET p3 = 2;

    ELSE

    SET p3 = 3;

    END IF;

    END$$

    DELIMITER ;

    mysql> call difference(1,10,@p);

    Query OK, 0 rows affected (0.00 sec)

    mysql> select @p;

    +------+

    | @p |

    +------+

    | 3 |

    +------+

    1 row in set (0.01 sec)

    七、函数

    1.返回值

    两个return:一个标志返回什么类型;一个实际的返回值。

    2.调用函数:函数需要出现在=的右边

    例子:

    DELIMITER $$

    CREATE FUNCTION SimpleCompare(n INT, m INT)

    RETURNS VARCHAR(20)

    BEGIN

    DECLARE s VARCHAR(20);

    IF n > m THEN SET s = '>';

    ELSEIF n = m THEN SET s = '=';

    ELSE SET s = '

    END IF;

    SET s = CONCAT(n, ' ', s, ' ', m);

    RETURN s;

    END$$

    DELIMITER ;

    mysql> select SimpleCompare(1,2) ;

    +--------------------+

    | SimpleCompare(1,2) |

    +--------------------+

    | 1 < 2 |

    +--------------------+

    1 row in set (0.01 sec)

    mysql> set @a=SimpleCompare(1,2) ;

    Query OK, 0 rows affected (0.01 sec)

    mysql> select @a;

    +-------+

    | @a |

    +-------+

    | 1 < 2 |

    +-------+

    1 row in set (0.00 sec)

    八、case…end case

    例1:

    DELIMITER $$

    CREATE PROCEDURE difference1(

    IN p1 INTEGER,

    IN p2 INTEGER,

    OUT p3 INTEGER)

    BEGIN

    CASE

    WHEN p1 > p2 THEN

    SET p3 = 1;

    WHEN p1= p2 THEN

    SET p3 = 2;

    ELSE

    SET p3 = 3;

    END CASE;

    END$$

    DELIMITER ;

    mysql> call difference1(1,100,@a);

    Query OK, 0 rows affected (0.01 sec)

    mysql> select @a;

    +------+

    | @a |

    +------+

    | 3 |

    +------+

    1 row in set (0.00 sec)

    例2:

    DELIMITER $$

    CREATE PROCEDURE p(x INT)

    BEGIN

    DECLARE v INT DEFAULT 1;

    set v=x;

    CASE v

    WHEN 2 THEN SELECT v;

    WHEN 3 THEN SELECT 0;

    ELSE

    BEGIN

    END;

    END CASE;

    END$$

    DELIMITER ;

    mysql> call p(2);

    +------+

    | v |

    +------+

    | 2 |

    +------+

    1 row in set (0.00 sec)

    Query OK, 0 rows affected (0.01 sec)

    mysql> call p(3);

    +---+

    | 0 |

    +---+

    | 0 |

    +---+

    1 row in set (0.00 sec)

    Query OK, 0 rows affected (0.00 sec)

    九、while

    例题:

    DELIMITER $$

    CREATE PROCEDURE dowhile(x int)

    BEGIN

    DECLARE v1 INT DEFAULT 5;

    set v1=x;

    WHILE v1 > 0 DO

    select v1;

    SET v1 = v1 - 1;

    END WHILE;

    END$$

    DELIMITER ;

    mysql> call dowhile(10);

    +------+

    | v1 |

    +------+

    | 10 |

    +------+

    1 row in set (0.01 sec)

    +------+

    | v1 |

    +------+

    | 9 |

    +------+

    1 row in set (0.01 sec)

    。。。一直到1

    十、repeat…until

    先执行,再判断。

    例题:

    delimiter //

    CREATE PROCEDURE dorepeat1(p1 INT)

    BEGIN

    SET @x = 0;

    REPEAT

    SET @x = @x + 1;

    UNTIL @x > p1

    END REPEAT;

    END//

    delimiter ;

    mysql> call dorepeat1(10);

    Query OK, 0 rows affected (0.01 sec)

    mysql> select @x;

    +------+

    | @x |

    +------+

    | 11 |

    +------+

    十一、loop配合leave

    leave:跳出语句块

    DELIMITER $$

    CREATE PROCEDURE small_exit(OUT p1 INTEGER,OUT p2 INTEGER)

    BEGIN

    SET p1 = 1;

    SET p2 = 1;

    block1: BEGIN

    LEAVE block1; --》就不再执行下面那个p2=3了!!

    SET p2 = 3;

    END block1;

    SET p1 = 4;

    END$$

    DELIMITER ;

    mysql> call small_exit(@a,@b);

    Query OK, 0 rows affected (0.00 sec)

    mysql> select @a,@b;

    +------+------+

    | @a | @b |

    +------+------+

    | 4 | 1 |

    +------+------+

    1 row in set (0.00 sec)

    loop

    DELIMITER $$

    CREATE PROCEDURE wait_n(IN wait_seconds INTEGER)

    BEGIN ---》PS:interval 间隔

    DECLARE end_time datetime DEFAULT now() + INTERVAL wait_seconds SECOND;

    wait_loop:LOOP

    IF now() > end_time THEN

    LEAVE wait_loop;

    END IF;

    END LOOP wait_loop;

    END$$

    DELIMITER ;

    mysql> call wait_n(10);

    Query OK, 0 rows affected (10.55 sec)

    while:先判断再执行

    repeat…until:先执行再判断

    loop:判断可以放在loop…end loop之间的任意位置

    iterate:跳出本次循环

    十二、ITERATE

    DELIMITER $$

    CREATE PROCEDURE doiterate3(p1 INT,p2 INT)

    BEGIN

    label1: LOOP

    SET p1 = p1 + 1;

    SET p2 = p2 + 1;

    IF p1 < 10 THEN

    select p1;

    ITERATE label1; --》跳出本次label1循环!继续下次label1循环。

    select p2; --》一直没执行

    END IF;

    LEAVE label1;

    END LOOP label1;

    SET @x = p1;

    END$$

    DELIMITER ;

    mysql> call doiterate3(10,10); --》直接就执行leave label1

    Query OK, 0 rows affected (0.01 sec)

    mysql> call doiterate3(1,1); ---》显示p1=2,3,4...9

    +------+

    | p1 |

    +------+

    | 2 |

    +------+

    1 row in set (0.00 sec)

    +------+

    | p1 |

    +------+

    | 3 |

    +------+

    1 row in set (0.00 sec)

    十三、select info经典用法

    DELIMITER $$

    CREATE PROCEDURE total_penalties_player(

    IN p_playerno INTEGER,

    OUT total_penalties DECIMAL(8,2))

    BEGIN

    SELECT sum(amount) ---》去掉into的select只能返回一行数据!

    INTO total_penalties --》把select 的结果into给(多个)变量!!

    FROM PENALTIES

    WHERE playerno = p_playerno;

    END$$

    DELIMITER ;

    mysql> call total_penalties_player(44,@a); ---》计算44号人的罚款总额,结果赋给@a

    Query OK, 1 row affected (0.01 sec)

    mysql> select @a;

    +--------+

    | @a |

    +--------+

    | 130.00 |

    +--------+

    1 row in set (0.00 sec)

    小结:

    1.经典的方式:将select返回的多列单行数据赋值给相应的变量(一个列对应一个变量)

    2.这些变量经常是out参数

    3.也就是变相的将select的结果传给了存储过程,让外面的程序可见。

    例2:into给多个参数:

    DELIMITER $$

    CREATE PROCEDURE get_address(

    IN p_playerno SMALLINT,

    OUT p_street VARCHAR(30),

    OUT p_houseno VARCHAR(4),

    OUT p_town VARCHAR(30),

    OUT p_postcode VARCHAR(6))

    BEGIN

    SELECT street, houseno, town, postcode

    INTO p_street, p_houseno, p_town, p_postcode

    FROM PLAYERS

    WHERE playerno = p_playerno;

    END$$

    DELIMITER ;

    mysql> call get_address(44,@a,@b,@c,@d);

    Query OK, 1 row affected (0.01 sec)

    mysql> select @a,@b,@c,@d;

    +--------------+------+-----------+--------+

    | @a | @b | @c | @d |

    +--------------+------+-----------+--------+

    | Lewis Street | 23 | Inglewood | 4444LJ |

    +--------------+------+-----------+--------+

    1 row in set (0.00 sec)

    展开全文
  • mysql 存储过程

    2017-03-31 17:28:05
    什么是存储过程 ...为用存储过程存储过程说白了就是一堆 SQL 的合并。中间加了点逻辑控制 但是存储过程处理比较复杂的业务时比较实用 优点:  1.进行了编译, 执行速度会快 2.程序容易出现 BUG 不
  • 今天接到了一个新任务,在sql server 里面用存储过程写一个百元买百鸡的代码。 First 百元买百鸡是? 今鸡翁一,值钱伍;鸡母一,值钱三;鸡鶵三,值钱一。凡百钱买鸡百只,问鸡翁、母、鶵各几何? 通俗点来说呢...
  • 如果没有显式指定,他会隐含地指定一系列特性(characteristic)的默认值来创建存储过程通常在使用图形界面工具进行存储过程编写的时候,图形界面工具会自动加上这部分内容比,如HeidiSQL创建存储过程的时候,会自动...
  • 如果没有显式指定,他会隐含地指定一系列特性(characteristic)的默认值来创建存储过程通常在使用图形界面工具进行存储过程编写的时候,图形界面工具会自动加上这部分内容比如HeidiSQL创建存储过程的时候,会自动...
  • 如果没有显式指定,他会隐含地指定一系列特性(characteristic)的默认值来创建存储过程通常在使用图形界面工具进行存储过程编写的时候,图形界面工具会自动加上这部分内容比,如HeidiSQL创建存储过程的时候,会自动...
  • php调用mysql存储过程

    2021-01-21 15:33:50
    调用带select语句的存储过程就出现 PROCEDURE p can’t return a result set in the given context的错误。google了半天,在mysql官网上找到一些说法,db_mysql的模块不支持存储过程调用,解决方法是...
  • 动手写了动态SQL过存储过程分页。感觉和oracle语法不太一样外。其他感觉没区别。。  这个是通用存储过程。但是一个问题我没解决是条件怎么通用写。我条件都是拼接字符串感觉很不安全。不晓得博友门有木有什么...
  • MySQL存储过程详解

    2017-11-08 21:01:52
    问:为用存储过程? 答: ①将重复性很高的一些操作,封装到一个存储过程中。简化了对这些SQL的调用。 ②批量处理sql+循环 ③统一接口 注意:mysql中,存储功能相对较弱。使用较少。 =====二、基本建立...
  • 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后...前言:很多人都说存储过程过时了,学这玩意没啥用,你去外面面试的时候根本就不怎么需要
  • 写了四张表的存储过程,并要分别建四个定时任务去执行这四个过程,其中三个存储过程创建,然后创建定时任务,没问题,维一个始终报错,报的错也看不懂是。 于是就在网上查找相关问题码,最后找到一篇文章说是...
  • 通常在使用图形界面工具进行存储过程编写的时候,图形界面工具会自动加上这部分内容比,如HeidiSQL创建存储过程的时候,会自动生成这些特性(characteristic)的默认值。但是这些特性究竟是干的,什么影...
  • 一、什么是mysql引擎,有啥用?mysql存储数据时,有不同的存储方式,这些方式都使用了不同的层次实现(如:存储机制,索引技巧,锁定水平),底层实现的差异带来的功能也就不同。在不同的场景下使用合适的存储方式就能...
  • 最近人问我为之前ibatis调用存储过程的时候要update而不用queryForObject,一时忘记答不上来有点小尴尬,所以查询相关资料后记录一下== spring + iBatis 调用 oracle /mysql存储过程 sqlmap 这样写 {call ...
  • 存储过程(Stored Procedure,以下简称SP)是什么?优缺点?  一个SP是一段存储在数据库系统中的一条或多条sql语句的集合,类似一条批处理,它能被触发器,或者其他的SP以及APP触发。 直观看来,就像是...
  • 4:把过多的逻辑写在存储过程里,违背面向服务,面向接口的理念,不要把都写在数据库里。5:调试程序,修改维护程序,逻辑都写在存储过程了,不好维护,不容易发现错误,不能发挥VS2010类似编辑器的优点,C...
  • 只是想着技术,到是通过这个项目把存储过程基本能的都了,oracle开发的技术我感觉基本都全活了。别人没搞定的我搞定了,搞笑的是别人通过这个项目都升职加薪了,结果我气跑了,我是不是干没用的。所以说程序员的...
  • asp.net gridview分页 aspnetpager插件实现 无存储过程 。看了网上很多例子仍然是很多疑惑,经过一早上的研究,其实用法很简单。可能是网上的例子,调用的方法是干啥用的没有写明白,所以导致一些代码看的云里雾里...
  • 日前个脑水的朋友提出要从sql存储过程多个结果集中取得一个想要的结果集在自己的另一个存储过程中用,我考!  我回答:“自己写个去@Table,游标,临时表都可以。”  他又说:“那我不是要重写很多?”  ...
  • 存储过程,视图,临时表,事务等这些之前只是学过,但没有仔细想过是干的,什么情况下。所以这就像别人让你去东边,你就去东边,但去了东边,却不知道去那干? 所以为了灵活应用,今天就来汇总下。 也希望对...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 180
精华内容 72
关键字:

存储过程有啥用