1、数据 *** 纵语言(DML):用来 *** 纵数据库中数据的命令。包括:select、insert、update、delete。
2、数据定义语言(DDL):用来建立数据库、数据库对象和定义列的命令。包括:create、alter、drop。
3、数据控制语言(DCL):用来控制数据库组件。
PostgreSQL的PL/pgSQL语言是支持动态SQL语句的(说execute immediate的是ECPG所支持的)。但是,要记得重要的一点: 是在PL/pgSQL语言中支持。而PL/pgSQL语言一个块结构的语言,它以begin ... end为块的开始与结束标识。这也就是说,要执行动态SQL语句,就必须放到begin ... end块中,而不要想实现一个单独的动态SQL语句。在SQL Server中,倒是可以轻松的实现,我们可以直接执行一个这样的动态SQL:
execute sp_executesql N'select 1 as val'而在PostgreSQL中,就不要有此想法了。当然,SQL Server的这种动态SQL语句的执行方法也有其局限与不便的地方。
在PL/pgSQL中,执行动态SQL的格式如下(摘录自说明文档):
EXECUTE command-string [ INTO [STRICT] target ] [ USING expression [, ... ] ]其中,
command-string就是要执行的动态SQL语句(一定要记住:这里是SQL语句,不是PL/pgSQL语句,像raise notice就不能使用);
INTO子句是把SQL查询到的值赋给INTO指定的变量;
USING子句是前面的command-string中替代变量($1, $2, ...)的赋值;
示例:
do $$declare
v_c1 integer
v_c2 integer
begin
execute 'select count(*) as c1, count(*) as c2 from (select 1 as idx union select 11 as idx union select 21 as idx) s where idx > $1'
into v_c1, v_c2
using 10
raise notice '%, %', v_c1, v_c2
你真是牛人呀。数据库类型那么多,有oracle mysql DB2 SQL SQLsevera。你使用的那种。
相对于来说我使用oracle多。
给你一个pro*c的 *** 作实例吧
/ 定义符号常数#define USERNAME "SCOTT"
#define PASSWORD "x"
#include <stdio.h>
// 说明SQLCA和ORACA
EXEC SQL INCLUDE SQLCA
EXEC SQL INCLUDE ORACA
// 启用ORACLE通讯区:ORACA=YES,使它能被使用
EXEC ORACLE OPTION (ORACA=YES)
// 说明SQL变量
EXEC SQL BEGIN DECLARE SECTION
char* username=USERNAME
char* password=PASSWORD
VARCHAR sqlstmt[80]
int emp_number
VARCHAR emp_name[15]
VARCHAR job[50],job1[50],job2[50]
float salary
EXEC SQL END DECLARE SECTION
main()
{
EXEC SQL WHENEVER SQLERROR GOTO sqlerror
// 发生错误时,保存SQL语句至ORACA
oraca.orastxtf=ORASTFERR
// 登录到ORACLE
EXEC SQL CONNECT :username IDENTIFIED BY :password
printf("/nConnect to ORACLE./n")
// 构造动态SQL语句
sqlstmt.len=sprintf(sqlstmt.arr,"INSERT INTO EMP(EMPNO,ENAME,JOB,SAL)VALUES(:V1,:V2,:V3,:V4)")
// 显示SQL语句
puts(sqlstmt.arr)
// 用PREPARE语句分析当前的动态INSERT语句,语句名是S
EXEC SQL PREPARE S FROM :sqlstmt
// 循环插表
for()
{
printf("/nEnter employee number:")
scanf("%d",&emp_number)
if(emp_number==0)break
printf("/nEnter employee name:")
scanf("%s",&emp_name.arr)
emp_name.len=strlen(emp_name.arr)
printf("/nEnter employee job:")
scanf("%s",&job.arr)
job.len=strlen(job.arr)
salary = 0// With VC6, Missing this line will cause C Run-Time Error R6002.
printf("/nEnter salary:")
scanf("%f",&salary)
EXEC SQL EXECUTE S USING :emp_number,:emp_name,:job,:salary
}
// 提交事务,退出ORACLE
EXEC SQL COMMIT RELEASE
printf("/nHave a good day!/n")
exit(0)
sqlerror:
// 打印错误信息
printf("/n%.*s/n",sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc)
// 打印出错SQL语句
printf("/n/"%.*s.../"/n",oraca.orastxt.orastxtl,oraca.orastxt.orastxtc)
// 打印出错SQL语句所在行号及所在文件名
printf("on line %d of %.*s/n/n",oraca.oraslnr,
oraca.orasfnm.orasfnml,oraca.orasfnm.orasfnmc)
// 回滚事务,退出ORACLE
EXEC SQL WHENEVER SQLERROR CONTINUE
EXEC SQL ROLLBACK RELEASE
exit(1)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)