一些提示

所有四种方法都需要用户把动态SQL语句存储在一个字符串中,可以是字符串类型的主变量,也可以是一个用双引号括住的字符串。在存储SQL语句到字符串中的时候,删去嵌入式SQL语句句首的EXEC SQL关键字和语句终结符';'。

用方法2和方法3,输入主变量的占位符数目和数据类型必须在编译时确定。

序数越大的方法,对于应用程序的约束越少,但是编码更困难、更复杂。所以,我们建议尽量使用简单的方法。然而,如果方法1的动态SQL语句需要多次执行,那么就使用方法2,这可以避免每次执行时都需要重新分析SQL语句。

方法4提供了最大的灵活性,但是需要复杂的编码和对于动态SQL概念的完全理解。所以,只有在无法使用方法1,2和3时才使用方法4。

具体的选择可以参考下图。

../../../../_images/image318.png

通常的错误

在PREPARE之前,把需要执行的字符串(包含一个合法的SQL语句)存储到相应的字符串变量中。如果多次使用相同的字符串变量,但是用了不同的字符串内容,那么最好在使用前清空该字符串,否则可能会因为第二次存储的字符串比较短而未完全覆盖原字符串内容,产生奇怪的错误。

对于字符串类型的输入主变量,必须在字符串结束的后一个位置放上表示字符串结束的'\0',否则系统会产生输入字符串无结束符的错误。

如果使用VARCHAR变量来存储动态SQL语句,确定PREPARE或者EXECUTE IMMEDIATE语句执行前设置了该变量的长度。

用GET DESCRIPTOR从描述符读取结果的时候,输出主变量的容量必须大于等于描述符中可能存在的元组数。

产生错误的时候,考察相应的.c文件可以得到一些信息。