ps_10nestset.test
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. ###############################################
  2. #                                             #
  3. #   Prepared Statements test on               #
  4. #   "nested sets" representing hierarchies    #
  5. #                                             #
  6. ###############################################
  7. # Source: http://kris.koehntopp.de/artikel/sql-self-references (dated 1999)
  8. # Source: http://dbmsmag.com/9603d06.html (dated 1996)
  9. --disable_warnings
  10. drop table if exists t1;
  11. --enable_warnings
  12. # "Nested Set": This table represents an employee list with a hierarchy tree.
  13. # The tree is not modeled by "parent" links but rather by showing the "left"
  14. # and "right" border of any person's "region". By convention, "l" < "r".
  15. # As it is a tree, these "regions" of two persons A and B are either disjoint,
  16. # or A's region is completely contained in B's (B.l < A.l < A.r < B.r:
  17. # B is A's boss), or vice versa.
  18. # Any other overlaps violate the model. See the references for more info.
  19. create table t1  (
  20.   id     INTEGER AUTO_INCREMENT PRIMARY KEY,
  21.   emp    CHAR(10) NOT NULL,
  22.   salary DECIMAL(6,2) NOT NULL,
  23.   l INTEGER NOT NULL,
  24.   r INTEGER NOT NULL);
  25. prepare st_ins from 'insert into t1 set emp = ?, salary = ?, l = ?, r = ?';
  26. # Initial employee list:
  27. # Jerry ( Bert () Chuck ( Donna () Eddie () Fred () ) )
  28. set @arg_nam= 'Jerry'; set @arg_sal= 1000; set @arg_l= 1; set @arg_r= 12;
  29. execute st_ins using @arg_nam, @arg_sal, @arg_l, @arg_r ;
  30. set @arg_nam= 'Bert';  set @arg_sal=  900; set @arg_l= 2; set @arg_r=  3;
  31. execute st_ins using @arg_nam, @arg_sal, @arg_l, @arg_r ;
  32. set @arg_nam= 'Chuck'; set @arg_sal=  900; set @arg_l= 4; set @arg_r= 11;
  33. execute st_ins using @arg_nam, @arg_sal, @arg_l, @arg_r ;
  34. set @arg_nam= 'Donna'; set @arg_sal=  800; set @arg_l= 5; set @arg_r=  6;
  35. execute st_ins using @arg_nam, @arg_sal, @arg_l, @arg_r ;
  36. set @arg_nam= 'Eddie'; set @arg_sal=  700; set @arg_l= 7; set @arg_r=  8;
  37. execute st_ins using @arg_nam, @arg_sal, @arg_l, @arg_r ;
  38. set @arg_nam= 'Fred';  set @arg_sal=  600; set @arg_l= 9; set @arg_r= 10;
  39. execute st_ins using @arg_nam, @arg_sal, @arg_l, @arg_r ;
  40. select * from t1;
  41. # Three successive raises, each one is 100 units for managers, 10 percent for others.
  42. prepare st_raise_base from 'update t1 set salary = salary * ( 1 + ? ) where r - l = 1';
  43. prepare st_raise_mgr  from 'update t1 set salary = salary + ? where r - l > 1';
  44. let $1= 3;
  45. set @arg_percent= .10;
  46. set @arg_amount= 100;
  47. while ($1)
  48. {
  49.   execute st_raise_base using @arg_percent;
  50.   execute st_raise_mgr  using @arg_amount;
  51.   dec $1;
  52. }
  53. select * from t1;
  54. # Now, increase salary to a multiple of 50 (checks for bug#6138)
  55. prepare st_round from 'update t1 set salary = salary + ? - ( salary MOD ? )';
  56. set @arg_round= 50;
  57. execute st_round using @arg_round, @arg_round;
  58. select * from t1;
  59. drop table t1;
  60. # End of 4.1 tests