关于在delphi中通过tquery执行带冒号\":\"的sql语句

时间:2022-11-03 17:36:47

 作者:关于在delphi中通过tquery执行带冒号\":\"的sql语句 

在Delphi中用Tquery来执行Sql语句时,以冒号开头的字符串如:
Select * from Table where Field1=:Field1
其中的":Field1",会被BDE驱动认为是一个参数,而要求用户为其赋值,
如用户不为它赋值,则在执行时BDE会报:
Query1:Field'Field1' is of an Unknown type.
错误提示.

但在某些情况下,冒号":"本身就是数据库服务器所要求的SQL语句中必不可
少的一部分,如在ORACLE中创建触发器的SQL语句:
CREATE OR REPLACE TRIGGER TEST
BEFORE INSERT
ON TABLE
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
BEGIN
   SELECT SEQ.NEXTVAL INTO :NEW.ID FROM DUAL;
END;
这个SQL语句中的":NEW.ID"指代的是表的新记录,其中冒号是必不可少的,
但是如果把这段SQL语句直接通过TQUERY来执行,问题就出来的,因为BDE会
要求用户为"NEW.ID"赋值,为了使BDE不认为":NEW.ID"是一个参数,就需要
使用转意字符将SQL语句中的冒号":"处理一个,在这里使用两个冒号就可以
了,如下所示:
...
SELECT SEQ.NEXTVAL INTO ::NEW.ID FROM DUAL;
...
这样SQL语句就可以正常的透过BDE被ORACLE处理了.

在Delphi中使用转意字符的地方还有很多,如在字符串中用两个单引号来表
示字符中实际包含一个单引号等.

所以,一般在DELPHI中如果遇到要处理的字符串中包含DELPHI自己默认的特殊
符号,都可以用两个该字符来转意一下试试.