Linux下RM/COBOL通过InstantSql操作PostgreSQL建删表失败求助
解决RM/COBOL InstantSQL执行PostgreSQL DDL语句的语法错误问题
问题原因
你当前使用的SQL PREPARE QUERY + SQL START QUERY组合是InstantSQL专为**返回结果集的操作(如SELECT)**设计的语法。而CREATE TABLE/DROP TABLE/GRANT这类DDL语句属于非查询类操作,不会返回结果集,用这套流程执行会触发语法解析错误(错误码HY000)。
解决方案
对于DDL语句,直接使用SQL EXECUTE IMMEDIATE语句执行,无需经过PREPARE和START QUERY步骤。
示例:执行DROP TABLE
MOVE "drop table persons1" TO sql-QrySQL SQL EXECUTE IMMEDIATE sql-ConnectionHandle, sql-QrySQL. IF NOT sql-OK display "UNSUCCESFUL EXECUTE!!!" PERFORM WITH TEST AFTER UNTIL sql-EndOfData SQL DESCRIBE ERROR sql-Error-Description IF NOT sql-EndOfData PERFORM DISPLAY-ERROR-INFO END-IF END-PERFORM GO TO Z END-IF
示例:执行CREATE TABLE
MOVE "CREATE TABLE Persn2(PersonID int)" TO sql-QrySQL SQL EXECUTE IMMEDIATE sql-ConnectionHandle, sql-QrySQL. IF NOT sql-OK display "UNSUCCESFUL EXECUTE!!!" PERFORM WITH TEST AFTER UNTIL sql-EndOfData SQL DESCRIBE ERROR sql-Error-Description IF NOT sql-EndOfData PERFORM DISPLAY-ERROR-INFO END-IF END-PERFORM GO TO Z END-IF
示例:执行GRANT语句
注意:PostgreSQL中GRANT语句的用户不需要加单引号,修正后语句如下:
MOVE "grant create on database ttrac to postgres;" TO sql-QrySQL SQL EXECUTE IMMEDIATE sql-ConnectionHandle, sql-QrySQL. IF NOT sql-OK display "UNSUCCESFUL EXECUTE!!!" PERFORM WITH TEST AFTER UNTIL sql-EndOfData SQL DESCRIBE ERROR sql-Error-Description IF NOT sql-EndOfData PERFORM DISPLAY-ERROR-INFO END-IF END-PERFORM GO TO Z END-IF
关键说明
SQL EXECUTE IMMEDIATE专门用于执行不需要返回结果集的SQL语句,包括DDL、DML中的非查询操作(如不带RETURNING子句的INSERT/UPDATE/DELETE)。- 你之前成功执行的SELECT/UPDATE/INSERT(带结果集或需要处理返回值)仍可继续使用
PREPARE QUERY+START QUERY流程。
内容的提问来源于stack exchange,提问作者user22426344
相关产品推荐
相关产品推荐

