PL/sql_Proc*C简单语法

来源:互联网 发布:网络代写兼职 编辑:程序博客网 时间:2024/05/21 06:32
--------PL/SQL--oracle--组成 EXEC SQL sqlstatements; --数据段中的变量在由    :变量名  --...表示其他代码--[]{}表示一起出现--|表示多选一#undef SQLCAEXEC SQL INCLUDE SQLCA;/*通用区说明*/--*****************************************************--*****************************************************EXEC SQL BEGIN DECLARE SECTION;--数据段host variableVARCHAR varUser[20+1];VARCHAR varPswd[20+1];VARCHAR varDB[20+1];--在EXEC和C中均可使用的变量,且使用时候--C中      变量名            varname--EXEC SQL 冒号+变量名       :varnameEXEC SQL END DECLARE SECTION;--数据段--*****************************************************--*****************************************************VARCHAR   username[20];/*host variable*/struct /*C中自己定义,*/{     unsigned short  len;     unsigned char   arr[20]; } username; --*****************************************************--*****************************************************--连接数据库,用户名,密码,数据库名要在数据段内定义声明--http://docs.oracle.com/cd/B28359_01/appdev.111/b28427/pc_11thr.htm#i1000591---------------------------------------EXEC SQL CONNECT { :user IDENTIFIED BY :oldpswd | :usr_psw }   [[ AT { dbname | :host_variable }] USING :connect_string ]     [ {ALTER AUTHORIZATION :newpswd  |  IN { SYSDBA | SYSOPER } MODE} ] ;---------------------------------------远程主机地址 AT { dbname | :host_variable }--EXEC SQL CONNECT :username IDENTIFIED BY :password ; ----------------------------------------EXEC SQL CONNECT :usr_pwd; EXEC SQL CONNECT :用户名 IDENTIFIED BY :密码 USING :数据库名--*****************************************************--*****************************************************--PL/SQL BlocksEXEC SQL AT :db_name EXECUTE    begin        /* PL/SQL block here */    end;END-EXEC;--*****************************************************--*****************************************************--多线程SQL执行文档--变量sql_context <context_variable>;--EXEC SQL ENABLE THREADS;--EXEC SQL CONTEXT ALLOCATE :context_var;--EXEC SQL CONTEXT USE { :context_var | DEFAULT};--EXEC SQL CONTEXT FREE :context_var;main() {   sql_context ctx1,ctx2;           /* declare runtime contexts 定义声明文本变量*/   EXEC SQL ENABLE THREADS;--多个线程需要此句   EXEC SQL CONTEXT ALLOCATE :ctx1;--分配文本空间ctx1   EXEC SQL CONTEXT ALLOCATE :ctx2;--分配文本空间ctx2   .../* spawn thread, execute function1 (in the thread) passing ctx1 *创建线程,在此线程内通过文件ctx1执行句柄函数function1*/   thread_create(..., function1, ctx1);  /* spawn thread, execute function2 (in the thread) passing ctx2 *创建线程,在此线程内通过文件ctx2执行句柄函数function2*/   thread_create(..., function2, ctx2);   ...   EXEC SQL CONTEXT FREE :ctx1;--释放   EXEC SQL CONTEXT FREE :ctx2;   ...}void function1(sql_context ctx){   EXEC SQL CONTEXT USE :ctx;/* execute executable SQL statements on runtime context ctx1!!! *在ctx1运行环境下执行可执行SQL语句*/   ...} void function2(sql_context ctx) {   EXEC SQL CONTEXT USE :ctx;/* execute executable SQL statements on runtime context ctx2!!! **在ctx2运行环境下执行可执行SQL语句*/   ...}--*****************************************************--*****************************************************--查询语句,查询结果存放在数据段的dept_name变量中,可在C部分使用EXEC SQL SELECT DNAME       INTO :dept_name       FROM DEPT       WHERE DEPTNO= :dept_number;------------查询数据并判断是不是NULLEXEC SQL SELECT ename, sal, comm     INTO :emp_name, :salary, :commission:ind_comm     FROM emp     WHERE empno = :emp_number;     if (ind_comm == -1)     pay = salary;   /* commission is NULL; ignore it */     else     pay = salary + commission;-------------比较是否相等包括NULLEXEC SQL SELECT ename, sal      INTO :emp_name, :salary      FROM emp      WHERE (comm = :commission) OR ((comm IS NULL) AND           (:commission INDICATOR :ind_comm IS NULL)); --*****************************************************--*****************************************************--插入语句,数据段的emp_name变量,可在C部分使用strncpy(emp_name, "MILLER    ", 10); /* 4 trailing blanks */ EXEC SQL INSERT INTO emp (empno, ename, deptno) VALUES     (1234, :emp_name, 20); ------------如果要插入NULL,1直接NULL,2set为-1,3ind_empnum=-1标识插入NULLEXEC SQL INSERT INTO emp (empno, comm)      VALUES (:emp_number, NULL); -----------------set ind_comm = -1; EXEC SQL INSERT INTO emp (empno, comm)      VALUES (:emp_number, :commission:ind_comm); -------------------if (emp_number == 0)     ind_empnum = -1;      else     ind_empnum = 0;      EXEC SQL INSERT INTO emp (empno, sal)          VALUES (:emp_number:ind_empnum, :salary); --*****************************************************--*****************************************************--更新语句,数据段的loblen, blob,key;变量,可在C部分使用EXEC SQL UPDATE executables    SET length = :loblen, binary = :blob WHERE name = :key;--*****************************************************--*****************************************************--删除语句,数据段的key;变量,可在C部分使用EXEC SQL DELETE FROM executables WHERE name = :key;--*****************************************************--*****************************************************--游标控制Cursor ControlEXEC SQL AT :db_name DECLARE emp_cursor CURSOR FOR ... /*定义声明游标*/EXEC SQL OPEN emp_cursor ... /*执行sql,且游标标志第一条数据,此前db_name可变,后不可*/EXEC SQL FETCH emp_cursor ... /*取下一条数据*/EXEC SQL CLOSE emp_cursor;/*关闭游标*/-------------------------------------EXEC SQL DECLARE emp_cursor CURSOR FOR     SELECT ename, job, sal FROM emp WHERE deptno = 20; ------------------------------------- .../* define a cursor */    EXEC SQL DECLARE emp_cursor CURSOR FOR         SELECT ename, job         FROM emp         WHERE empno = :emp_number         FOR UPDATE OF job;  /* open the cursor and identify the active set */    EXEC SQL OPEN emp_cursor;  /* break if the last row was already fetched */    EXEC SQL WHENEVER NOT FOUND DO break; --EXEC SQL WHENEVER NOT FOUND GOTO ... /* fetch and process data in a loop */    for (;;)    {       EXEC SQL FETCH emp_cursor INTO :emp_name, :job_title;  /* optional host-language statements that operate on the FETCHed data */        EXEC SQL UPDATE emp            SET job = :new_job_title            WHERE CURRENT OF emp_cursor; } ... /* disable the cursor */ EXEC SQL CLOSE emp_cursor; EXEC SQL COMMIT WORK RELEASE; ...  --*****************************************************--*****************************************************

0 0
原创粉丝点击