可将 SQLJ 语句与 SQLJ 文件中的 Java™ 语句混合。
使用 SQLJ 编写的静态 SQL 语句出现在 SQLJ 子句中。SQLJ 转换程序会识别 SQLJ 子句,原因是它们以标记 #sql 开始并以分号结束。
最简单的 SQLJ 子句是可执行子句,由标记 #sql 及跟在其后的用花括号括起来的 SQL 语句组成。例如,每当 Java 语句可能以合法形式出现时,可能会出现以下 SQLJ 子句。SQLJ 子句的用途是删除表 MYTABLE 中的所有行:
#sql { DELETE FROM MYTABLE };
嵌入式 SQL 语句的自变量是通过主变量传递的,这些主变量是出现在 SQL 语句中的 Java 变量。主变量最多有三个部分:
Java 标识可以在生成的 Java 代码中多次出现以替换 SQLJ 子句。
以下查询包含主变量 :x,它是在包含查询的限定作用域中可视的 Java 变量、字段或参数 x:
SELECT COL1, COL2 FROM TABLE1 WHERE COL3 < :x
缺省情况下,在复合 SQL 中指定的所有主变量都是输入主变量。必须指定参数方式标识 OUT 或 INOUT,主变量才能将其标记为输出主变量。例如:
#sql {begin compound atomic static select count(*) into :OUT count1 from employee; end compound}
在 SQLJ 可执行子句中,出现在花括号内的标记是 SQL 标记(主变量除外,它们对应于 Java 变量)。主变量的前面必须有冒号字符(:)。SQL 标记决不出现在 SQLJ 可执行子句的花括号的外面。
例如,以下 Java 方法将其自变量的值插入到 SQL 表中。方法主体由包含主变量 x、y 和 z 的 SQLJ 可执行子句组成:
void m (int x, String y, float z) throws SQLException { #sql { INSERT INTO TAB1 VALUES (:x, :y, :z) }; }
不要初始化循环中的静态 SQL 语句。每个静态 SQL 语句都必须存在一个语句。例如,以下代码段是无效的:
for( int i=0; i<2; i++ ){ #sql [ctx] itr[i] = { SELECT id, name FROM staff }; }
用以下语句来替换以上的代码段:
int i=0; #sql [ctx] itr[i] = { SELECT id, name FROM staff }; i=1; #sql [ctx] itr[i] = { SELECT id, name FROM staff };
总之,SQL 标记是不区分大小写的(由双引号定界的标识除外),它们可以用大写、小写或混合大小写形式书写。但是,Java 标记是区分大小写的。为了使“SQLJ 帮助”主题中的示例意思明确,不区分大小写的 SQL 标记是大写的,Java 标记是小写或混合大小写的。小写 null 用来表示 Java 空值,大写 NULL 用来表示 SQL 空值。