plsql学习

  1. --设置数据库输出,默认为关闭,每次新打开窗口都要重新设置   
  2. set serveroutput on  
  3.   
  4. --调用     包           函数    参数   
  5. execute dbms_output.put_line('hello world');   
  6. --或者用call调用,相当于java中的调试程序打桩   
  7. call dbms_output.put_line('hello world');   
  8.   
  9. --pl语句块是pl/sql里最小的编程块,其中可以再嵌套begin end   
  10. begin  
  11.     dbms_output.put_line('Hello World');   
  12.     dbms_output.put_line('2*3='||(2*3));   
  13.     dbms_output.put_line('what''s');   
  14. end;   
  15.   
  16. --如何声明变量,所有变量必须再declare中声明,程序中不允许声明   
  17. --没有初始化的变量默认值为null,屏幕上null是看不见的,命名习惯:一般变量以v_开头   
  18. --注意number也能存小数,最长38位,所以以后建议整数都用binary_integer存   
  19. --long是字符类型,boolean类型补能打印   
  20. --标准变量类型:数字,字符,时间,布尔   
  21.   
  22. declare  
  23.     v_number1 number ;   
  24.     v_number2 number(3,2) ;   
  25.     v_number3 binary_integer :=1;   
  26.     v_name varchar2(20) :='kettas';   
  27.     v_date date :=sysdate;   
  28.     v_long long :='ni hao';   
  29.     v_b boolean := true;   
  30. begin  
  31.     if (v_number1 is nullthen  
  32.         dbms_output.put_line( 'hello');   
  33.     end if;   
  34.     dbms_output.put_line(v_number1);   
  35.     dbms_output.put_line(v_number2);   
  36.     dbms_output.put_line(v_number3);   
  37.     dbms_output.put_line(v_name);   
  38.     dbms_output.put_line(v_date);   
  39.     dbms_output.put_line(v_long);   
  40.     --dbms_output.put_line(v_b);   
  41. end;   
  42. /   
  43. --组合类型:record table   
  44. --record类型最常用,声明的时候可以加not null,但必须给初始值   
  45. --如果record类型一致可以相互赋值,如果类型不同,里面的字段恰好相同,不能互相赋值   
  46. declare  
  47.        type t_first is record(   
  48.             id number(3),   
  49.             name varchar2(20)   
  50.        );   
  51.        v_first t_first;   
  52. begin  
  53.      v_first.id:=1;   
  54.      v_first.name:='ws';   
  55.      dbms_output.put_line(v_first.id);   
  56.      dbms_output.put_line(v_first.name);   
  57. end;   
  58. /   
  59.   
  60. --考虑一下,oracle中赋值方式是拷贝还是引用方式   
  61. declare  
  62.        --v_number1 number:=1;   
  63.        --v_number2 number;   
  64.        type t_first is record(   
  65.          id number,   
  66.          name varchar2(20)      
  67.        );   
  68.        v_first t_first;   
  69.        v_second t_first;   
  70. begin  
  71.        --v_number2:=v_number1;   
  72.        --v_number1:=2;   
  73.        --dbms_output.put_line(v_number1);   
  74.        --dbms_output.put_line(v_number2);   
  75.        v_first.id:=1;   
  76.        v_first.name:='susu';   
  77.           
  78.           
  79.        --v_second:=v_first;   
  80.        v_second.id:=v_first.id;   
  81.        v_second.name:=v_first.name;   
  82.           
  83.           
  84.        v_first.id:=2;   
  85.        v_first.name:='kettas';   
  86.        dbms_output.put_line(v_first.id);   
  87.        dbms_output.put_line(v_first.name);   
  88.        dbms_output.put_line(v_second.id);   
  89.        dbms_output.put_line(v_second.name);   
  90.  end;   
  91.  /   
  92.     
  93.  -------------------------   
  94.  --table类型,相当于java中的map,就是一个可变长的数组,key必须是整数,可以是负数,value可以是标量,也可以是record   
  95.  --可以不按顺序赋值,但必须先赋值后使用   
  96.     
  97.  declare  
  98.         type t_tb is table of varchar2(20) index by binary_integer;   
  99.         v_tb t_tb;   
  100.  begin  
  101.       v_tb(100):='hello';   
  102.       v_tb(98):='world';   
  103.       dbms_output.put_line(v_tb(100));   
  104.       dbms_output.put_line(v_tb(98));   
  105.  end;         
  106.   
  107.   
  108. declare  
  109.         type t_rd is record(id number,name varchar2(20));   
  110.         type t_tb is table of t_rd index by binary_integer;   
  111.         v_tb2 t_tb;   
  112. begin  
  113.         v_tb2(100).id:=1;   
  114.         v_tb2(100).name:='hello';   
  115.         --dbms_output.put_line(v_tb2(100).id);   
  116.         --dbms_output.put_line(v_tb2(100).name);   
  117.         dbms_output.put_line(v_tb2(100).id||'    '||v_tb2(100).name);   
  118. end;   
  119. /   
  120.   
  121. --%type 和 %rowtype 以及如何从数据库把数据取回来   
  122. create table student33(   
  123.        id number,   
  124.        name varchar2(20),   
  125.        age number(3,0)   
  126. );   
  127.   
  128. insert into student(id,name,age) values(1,'susu',23);   
  129. --查找一个字段的变量   
  130.   
  131. declare  
  132.        v_name varchar2(20);   
  133.        v_name2 student.name%type;   
  134. begin  
  135.        select name into v_name2 from student33 where rownum=1;   
  136.        dbms_output.put_line(v_name2);   
  137. end;   
  138. /   
  139.   
  140. --查找多个字段的变量   
  141. declare  
  142.         v_id student33.id%type;   
  143.         v_name student33.name%type;   
  144.         v_age student33.age%type;   
  145. begin  
  146.       select id,name,age into v_id,v_name,v_age from student33 where rownum=1;   
  147.       dbms_output.put_line(v_id||'  '||v_name||'  '||v_age);   
  148. end;   
  149. /   
  150. --查找一个类型的变量,推荐用*   
  151.   
  152. declare  
  153.        v_student student33%rowtype;   
  154. begin  
  155.        select * into v_student from student33 where rownum=1;   
  156.        dbms_output.put_line(v_student.id||'  '||v_student.name||'  '||v_student.age);   
  157. end;   
  158. /   
  159.   
  160. --也可以按字段查找,但是字段顺序必须一样,不推荐这样做   
  161. declare  
  162.        v_student student33%rowtype;   
  163. begin  
  164.      select id,name,age into v_student from student33 where rownum=1;   
  165.      dbms_output.put_line(v_student.id||'  '||v_student.name||'  '||v_student.age);   
  166. end;   
  167. /   
  168.   
  169. declare  
  170.        v_student student33%rowtype;   
  171. begin  
  172.      select id,name,age into v_student.id,v_student.name,v_student.age from student33 where id=1;   
  173.      --select * into v_student.id,v_student.name,v_student.age from student33 where id=1;   
  174.      dbms_output.put_line();   
  175. end;   
  176. /   
  177.   
  178. --注意:insert,update,delete,select都可以,create table,drop table不行   
  179. --dpl,dml,和流程控制可以在pl/sql里用,ddl不行   
  180. declare  
  181.        v_name student33.name%type:='wang';   
  182. begin  
  183.      insert into student33(id,name,age) values(2,v_name,26);   
  184. end;   
  185. /   
  186. --下边这种方式也可以   
  187. begin  
  188.      insert into student33(id,name,age) values(5,'hehe',25);   
  189. end;   
  190. /   
  191.   
  192. declare  
  193.        v_name student.name%type:='hexian';   
  194. begin  
  195.      update student set name=v_name where id=1;   
  196. end;   
  197. /   
  198.   
  199. begin  
  200.      update student33 set name='qinaide' where id=2;   
  201. end;   
  202. /   
  203.   
  204. --delete   
  205. begin  
  206.      delete from student33 where id=5;   
  207. end;   
  208. /   
  209.   
  210. --变量的可见空间   
  211. declare  
  212.        v_i1 binary_integer:=1;   
  213. begin  
  214.      declare  
  215.             v_i2 binary_integer:=2;   
  216.      begin  
  217.           dbms_output.put_line(v_i1);   
  218.           dbms_output.put_line(v_i2);   
  219.      end;   
  220.      dbms_output.put_line(v_i1);   
  221.      --dbms_output.put_line(v_i2);   
  222. end;   
  223. /   
  224.   
  225. ------------------------流程控制   
  226.   
  227. --if判断   
  228. declare  
  229.        v_b boolean:=true;   
  230. begin if v_b then  
  231.              dbms_output.put_line('ok');   
  232.       end if;   
  233. end;   
  234. /   
  235.   
  236. --if else   
  237. declare  
  238.        v_b boolean:=true;   
  239. begin  
  240.      if v_b then  
  241.         dbms_output.put_line('ok');   
  242.      else  
  243.          dbms_output.put_line('false');   
  244.      end if;   
  245. end;   
  246. /   
  247.   
  248. --if elsif else   
  249. declare  
  250.        v_name varchar2(20):='ws';   
  251. begin  
  252.      if v_name='0701' then  
  253.         dbms_output.put_line('0701');   
  254.      elsif v_name='ws' then  
  255.         dbms_output.put_line('ws');   
  256.      else  
  257.          dbms_output.put_line('false');   
  258.      end if;   
  259. end;   
  260. /    
  261.   
  262. --loop循环,注意推出exit是推出循环,而不是推出整个代码块   
  263. declare  
  264.        v_i binary_integer:=0;   
  265. begin  
  266.      loop   
  267.          if v_i>10 then  
  268.             exit;   
  269.          end if;   
  270.          v_i:=v_i+1;   
  271.          dbms_output.put_line('hehe');   
  272.      end loop;   
  273.          dbms_output.put_line('over');   
  274. end;   
  275. /   
  276.   
  277. --更简单的写法   
  278. declare  
  279.        v_i binary_integer :=0;   
  280. begin  
  281.      loop   
  282.          exit when v_i>10;   
  283.          v_i :=v_i+1;   
  284.          dbms_output.put_line('hehe');   
  285.      end loop;   
  286.          dbms_output.put_line('over');   
  287. end;   
  288. /   
  289.   
  290. --while循环   
  291. declare  
  292.        v_i binary_integer:=0;   
  293. begin  
  294.        while v_i<10 loop   
  295.              dbms_output.put_line('hello'||v_i );   
  296.              v_i:=v_i+1;   
  297.        end loop;   
  298.        dbms_output.put_line('over');   
  299. end;   
  300. /   
  301.   
  302. --for循环,注意不需要声明变量   
  303. begin  
  304.      for v_i in 0..10 loop   
  305.          dbms_output.put_line('hello'||v_i);   
  306.      end loop;   
  307.          dbms_output.put_line('over');   
  308. end;   
  309. /   
  310.   
  311. --练习1用循环往student里插入30条记录   
  312. --要求:id为0,1,2...   
  313. --          name为kettas0,kettas1,kettas2...   
  314. --          age为11,12,13...   
  315. --练习2,假设不知道数据库里的数据规则和数量,   
  316. --把所有的student33数据打印到终端   
  317.   
  318. --问题1答案   
  319. declare  
  320.        v_student student33%rowtype;   
  321. begin  
  322.      delete from student33;   
  323.      for v_i in 0..20 loop   
  324.          insert v_student into student33(id,name,age) values(v_i,'kettas'||v_i,10+v_i);   
  325.      end loop;   
  326. end;   
  327. /   
  328. --也可以这样   
  329. begin  
  330.      delete from student33;   
  331.      for v_i in 0..20 loop   
  332.          insert into student33 values(v_i,'susu'||v_i,18+v_i);   
  333.      end loop;   
  334. end;   
  335.   
  336. --问题2答案   
  337. --rownum是伪列,在表里没有   
  338. --数据库先是执行from student33遍历student33表,如果没有where条件过滤,则先做成一个结果集,然后再看select   
  339. --后面的条件挑出合适的字段形成最后的结果集,如果有where条件,则不符合条件的就会从第一个结果集中删除   
  340. --后面的数据继续加进来判断,所以如果直接写rownum=2,或者rownum>10这样的语句就查不出数据   
  341. --可以用一个子查询解决   
  342. select rownum,id from student33 where rownum=2;   
  343.   
  344. declare  
  345.        v_number binary_integer;   
  346.        v_student student33%rowtype;   
  347. begin  
  348.      select count(*) into v_number from student33;   
  349.      for i in 1..v_number loop   
  350.          select id,name,age into v_student from(   
  351.                 select rownum rn,id,name,age from student33   
  352.          )where rn=i;   
  353.          dbms_output.put_line('id: '||v_student.id||' name:'||v_student.name);   
  354.      end loop;   
  355. end;   
  356.   
  357. --异常的定义使用   
  358. begin  
  359.      dbms_output.put_line(1/0);   
  360. exception   
  361.          when others then  
  362.               dbms_output.put_line('error');   
  363. end;   
  364.   
  365. declare  
  366.        e_myException exception;   
  367. begin  
  368.      dbms_output.put_line('hello');   
  369.      raise e_myException;--raise抛出异常,用此关键字向外抛异常   
  370.      dbms_output.put_line('world');   
  371.      dbms_output.put_line(1/0);   
  372. exception   
  373.          when e_myException then  
  374.               dbms_output.put_line(sqlcode);--当前会话执行状态,错误编码   
  375.               dbms_output.put_line(sqlerrm);--当前错误信息   
  376.               dbms_output.put_line('my error');   
  377.          when others then  
  378.               dbms_output.put_line('error');   
  379. end;   
  380.   
  381. --error表,每次有异常可以加到表里,相当于log日志   
  382. --id,code,errm,information,create date   
  383. --目前先这么写,学完存储过程后再改成一个过程,用的时候只需要调用即可   
  384. drop table error;   
  385.   
  386. create table error(   
  387.        id number,   
  388.        code number,   
  389.        errm varchar2(4000),   
  390.        information varchar2(4000),   
  391.        create_date date  
  392. );   
  393.   
  394. drop sequence my_key;   
  395. create sequence my_key;   
  396. insert into error values(my_key.nextVal,1,'xxx','xxxxx',sysdate);   
  397.   
  398. --具体做法   
  399. declare  
  400.        e_myException exception;   
  401. begin  
  402.      dbms_output.put_line('hello');   
  403.      raise e_myException;   
  404.      dbms_output.put_line('world');   
  405.      dbms_output.put_line(1/0);   
  406. exception   
  407.          when e_myException then  
  408.               declare  
  409.                      v_code binary_integer;   
  410.                      v_errm varchar2(4000);   
  411.               begin  
  412.                    v_code:=sqlcode;   
  413.                    v_errm:=sqlerrm;   
  414.                    insert into error values(my_key.nextVal,v_code,v_errm,'e_myException',sysdate);   
  415.               end;   
  416.          when others then  
  417.               dbms_output.put_line('error');   
  418. end;   
  419. /      
  420.   
  421. --cursor 游标(结果集)用于提取多行数据   
  422. --定义后不会有数据,使用后才有   
  423. --一旦游标被打开,就无法再次打开(可以先关闭,再打开)   
  424. declare  
  425.        cursor c_student is  
  426.               select * from student33;   
  427. begin  
  428.      open c_student;   
  429.      close c_student;   
  430. end;   
  431.   
  432. --第二种游标的定义方式,用变量控制结果集的数量   
  433. declare  
  434.        v_id binary_integer;   
  435.        cursor c_student is select * from student33 where id>v_id;   
  436. begin  
  437.      v_id:=10;   
  438.      open c_student;   
  439.      close c_student;   
  440. end;   
  441. /   
  442.   
  443. --第三种游标的定义方式,带参数的游标,用的最多   
  444. declare  
  445.        cursor c_student(v_id binary_integer) is select * from student33 where id>v_id;   
  446. begin  
  447.      open c_student(10);   
  448.      close c_student;   
  449. end;   
  450. /   
  451.   
  452. --游标的使用,一定别忘了关游标   
  453. declare  
  454.        v_student student33%rowtype;   
  455.        cursor c_student(v_id binary_integer) is select * from student33 where id>v_id;   
  456. begin  
  457.      open c_student(10);   
  458.      fetch c_student into v_student;   
  459.      close c_student;   
  460.      dbms_output.put_line(v_student.name);   
  461. end;   
  462.   
  463. --如何遍历游标fetch   
  464. --游标的属性 %found,%notfound,%isopen,%rowcount   
  465. --%found:若前面的fetch语句返回一行数据,则%found返回true,如果对未打开的游标使用则报ORA-1001异常   
  466. --%notfound,与%found行为相反   
  467. --%isopen,判断游标是否打开   
  468. --%rowcount:当前游标的指针位移量,到目前位置游标所检索的数据行的个数,若未打开就引用,返回ORA-1001   
  469.   
  470. --loop方式遍历游标   
  471. declare  
  472.        v_student student33%rowtype;   
  473.        cursor c_student(v_id binary_integer) is select * from student33 where id>v_id;   
  474. begin  
  475.      open c_student(10);   
  476.      loop   
  477.          fetch c_student into v_student;   
  478.          exit when c_student%notfound;   
  479.          dbms_output.put_line('name:'||v_student.name);   
  480.      end loop;   
  481.      close c_student;   
  482. end;   
  483.   
  484. --while循环遍历游标,注意,第一次游标刚打开就fetch,%found为null,进不去循环   
  485. --如何解决:while nvl(c_student%found,true) loop   
  486. declare  
  487.        v_student student33%rowtype;   
  488.        cursor c_student(v_id binary_integer) is select * from student33 where id>v_id;   
  489. begin  
  490.      open c_student(10);   
  491.      while c_student%found is null or c_student%found loop   
  492.            fetch c_student into v_student;   
  493.            dbms_output.put_line('name:'||v_student.name);   
  494.      end loop;   
  495.      close c_student;   
  496. end;   
  497.   
  498. --for循环遍历,最简单,用的最多,不需要声明v_student,打开关闭游标,fetch   
  499. declare  
  500.        cursor c_student(v_id binary_integer) is select * from student33 where id>v_id;   
  501. begin  
  502.      for v_student in c_student(10) loop   
  503.          dbms_output.put_line('name:'||v_student.name);   
  504.      end loop;   
  505. end;   
  506.   
  507. --goto例子,不推荐使用goto,会使程序结构变乱   
  508. declare  
  509.        i binary_integer:=0;   
  510. begin  
  511.      if i=0 then goto hello;end if;   
  512.      <<hello>>   
  513.      begin  
  514.           dbms_output.put_line('hello');   
  515.           goto over;   
  516.      end;   
  517.      <<world>>   
  518.      begin  
  519.           dbms_output.put_line('world');   
  520.           goto over;   
  521.      end;   
  522.      <<over>>   
  523.              dbms_output.put_line('over');   
  524. end;   
  525.   
  526.   
  527. --pl/sql day2   
  528. --存储过程:把匿名块存储下来   
  529. --匿名块运行后不会在数据库留下   
  530. declare  
  531.        v_content varchar2(4000):='hello';   
  532. begin  
  533.      dbms_output.put_line(v_content);   
  534. end;   
  535.   
  536. --创建或修改一个过程,ws_println(形式参数,声明类型即可),as可以替换成is   
  537. --变量可以声明在as和begin之间   
  538. create or replace procedure ws_println(v_content varchar2)   
  539. as    
  540. begin  
  541.      dbms_output.put_line(v_content);   
  542. end;   
  543.   
  544. --调用有参过程   
  545. execute ws_println('ws');   
  546. call ws_println('ws');   
  547. begin  
  548.      ws_println('ws');   
  549. end;   
  550.   
  551. --删除一个过程   
  552. drop procedure ws_println;   
  553. --查看数据库里的过程   
  554. select * from user_procedures;   
  555. select object_name,procedure_name from user_procedures;   
  556. desc user_procedures;   
  557.   
  558. --procedure里可以调用其它的procedure   
  559. create or replace procedure say_hello   
  560. is  
  561. begin  
  562.      ws_println('hello');   
  563. end;   
  564.   
  565. --或者这样也可以   
  566. create or replace procedure say_hello   
  567. as  
  568. begin  
  569.      ws_println('hi susu');   
  570. end;   
  571.   
  572. --调用无参过程的方式:   
  573. execute say_hello;   
  574. call say_hello();   
  575. begin  
  576.      say_hello;   
  577. end;   
  578.   
  579. --一个参数的存储过程   
  580. --输入参数in,输入参数不能进行赋值,默认不写就是in   
  581. --存储过程没有重载,这个有参的say_hello会替代上面的无参say_hello   
  582. create or replace procedure say_hello(v_name in varchar2)   
  583. as  
  584. begin  
  585.      --v_name:='a';   
  586.      ws_println('hello  '||v_name);   
  587. end;   
  588.   
  589. --调用有参的存储过程的两种方式   
  590. begin  
  591.      say_hello('susu');--方式1   
  592.      say_hello(v_name=>'xianbin');--方式2   
  593. end;   
  594.   
  595. --多个参数的存储过程   
  596. create or replace procedure say_hello   
  597.        (v_first_name in varchar2,v_last_name in varchar2)   
  598. as  
  599. begin  
  600.      ws_println('hello '||v_first_name||'.'||v_last_name);   
  601. end;   
  602.   
  603. --调用多个参数的两种方式   
  604. --方式一,这种方式需按顺序给出值,否则出现异常   
  605. begin  
  606.      say_hello('he','susu');   
  607. end;   
  608. --方式二,用指定型参名的方式调用可以不按顺序赋值   
  609. begin  
  610.      say_hello(v_last_name=>'he',v_first_name=>'susu');   
  611. end;   
  612.   
  613. --out输出参数,用于利用存储过程给一个或多个变量赋值,类似于返回值   
  614. create or replace procedure say_hello   
  615.        (v_name in varchar2,v_content out varchar2)   
  616. begin  
  617.      v_content:='hello'||v_name;   
  618. end;   
  619.   
  620. --调用   
  621. declare  
  622.        v_con varchar2(200);   
  623.        v_in varchar2(20):='wang';   
  624. begin  
  625.      say_hello(v_in,v_con);   
  626.      ws_println(v_con);   
  627. end;   
  628.   
  629. --in out参数,既赋值,又取值   
  630. create or replace procedure say_hello(v_name in out varchar2)   
  631. as  
  632. begin  
  633.      v_name:='hi '||v_name;   
  634. end;   
  635.   
  636. --调用   
  637. declare  
  638.        v_inout varchar2(20):='wangsu';   
  639. begin  
  640.      say_hello(v_inout);   
  641.      ws_println(v_inout);   
  642. end;   
  643.   
  644. --缺省参数   
  645. create or replace procedure say_hello(v_name varchar2 default 'susu',v_content varchar2 default 'hello')   
  646. as  
  647. begin  
  648.      ws_println(v_name||' '||v_content);   
  649. end;   
  650.   
  651. --调用,用指明形参名的方式调用更好   
  652. begin  
  653.      say_hello();   
  654. end;   
  655. begin  
  656.      say_hello(v_name=>'wangsu');   
  657. end;   
  658.   
  659. begin  
  660.      say_hello(v_content=>'hi');   
  661. end;   
  662.   
  663. --function函数   
  664. --过程和函数都以编译后的形式存放在数据库中,函数可以没有参数也可以有多个参数并有一个返回值。过程   
  665. --有零个或多个参数,没有返回值。函数和过程都可以通过参数列表接收或返回零个或多个值,函数和过程的   
  666. --主要区别不在于返回值,而在于他们的调用方式,过程是作为一个独立执行语句调用的,函数以合法的表达   
  667. --式的方式调用   
  668. create or replace function func(v_name in varchar2)   
  669. return varchar2   
  670. is  
  671. begin  
  672.      return(v_name||'  hello');   
  673. end;   
  674.   
  675. --调用   
  676. declare  
  677.        v_name varchar2(20);   
  678. begin  
  679.      v_name:=func('susu');   
  680.      ws_println(v_name);   
  681. end;   
  682.   
  683. --out 参数的函数   
  684. create or replace function func(v_name in varchar2,v_content out varchar2)   
  685. return varchar2   
  686. is  
  687. begin  
  688.      v_content:=v_name||' hello';   
  689.      return v_content;   
  690. end;   
  691. --调用   
  692. declare  
  693.        v_name varchar2(20);   
  694.        v_name1 varchar2(20);   
  695. begin  
  696.        v_name1:=func('susu',v_name);   
  697.        ws_println(v_name);   
  698.        ws_println(v_name1);   
  699. end;   
  700.   
  701. --in out 参数   
  702. create or replace function func(v_name in out varchar2)   
  703. return varchar2   
  704. is  
  705. begin  
  706.      v_name:=v_name||'  hello';   
  707.      return 'ws';   
  708. end;   
  709. --调用   
  710. declare  
  711.        v_inout varchar2(20):='world';   
  712.        v_ret varchar2(20);   
  713. begin  
  714.      v_ret:=func(v_inout);   
  715.      ws_println(v_inout);   
  716.      ws_println(v_ret);   
  717. end;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值