URL: https://linuxfr.org/forums/programmationautre/posts/oracle-proc Title: Oracle Pro*c Authors: bugjargal Date: 2004年12月17日T10:49:04+01:00 Tags: Score: 0 Bonjour à tous, Je commence à apprendre le c et pro*c en même temps (j'ai bvesoindes deux) et j'y arrive doucement... Je penses que mon fichier .pc est correct. En fait, la version windows du precompilateur Pro*c passe sans aucune erreur. Mais quand j'essaie de procéder à la precompilation sous linux (même version de precompilateur), j'obtiens le message suivant :
Error at line 203, column 1 in file grant_role.pc PCC-S-02010, found end-of-file while scanning string literal Error at line 0, column 0 in file grant_role.pc PCC-F-02102, Fatal error while doing C preprocessing
Plutôt raide... J'ai regardé dans tout mon code et je séche completement. Dans la doc oracle:
PCC-S-02010: found end-of-file while scanning string literal Cause: A string in a SQL statement, which should be delimited by single quotation marks, was not terminated properly. Action: Check that all strings are delimited.
Voici mon code, j'apprecierais vraiment si une bonne âme avais la moindre idée... :) #include stdio.h; #include string.h; #include sqlca.h; #include stdlib.h; #include sqlda.h; #include sqlcpr.h; EXEC SQL BEGIN DECLARE SECTION; char db_username[40]; char db_passwd[40]; char uid[81]; char CreateRole[255]; char GrantCreateSession[255]; char GrantCreateTable[255]; char GrantCreateView[255]; char GrantCreateTrigger[255]; char GrantUpdate[255]; char GrantInsert[255]; char GrantSelect[255]; char GrantAlter[255]; char GrantRoleToUser[255]; char SetDefaultRole[255]; char owner_name[40]; char quoted_owner_name[42]; char role_name[80]; char table_fqn[255]; sql_cursor table_cursor; struct { £spaces£ £/spaces£char used_table[50]; }table_record; EXEC SQL END DECLARE SECTION; void sql_error(msg) £spaces£ £/spaces£char *msg; { £spaces£ £/spaces£char err_msg[512]; £spaces£ £/spaces£size_t buf_len, msg_len; £spaces£ £/spaces£EXEC SQL WHENEVER SQLERROR CONTINUE; £spaces£ £/spaces£printf("\n%s\n", msg); /* Call sqlglm() to get the complete text of the * error message. */ £spaces£ £/spaces£buf_len = sizeof (err_msg); £spaces£ £/spaces£sqlglm(err_msg, &buf_len, &msg_len); £spaces£ £/spaces£printf("%.*s\n", msg_len, err_msg); £spaces£ £/spaces£EXEC SQL ROLLBACK RELEASE; £spaces£ £/spaces£exit(EXIT_FAILURE); } void main() { /*Get db passwd*/ £spaces£ £/spaces£sprintf(db_passwd,"%c",'0'); £spaces£ £/spaces£printf("\nEnter sys db password (0 to quit): "); £spaces£ £/spaces£gets(db_passwd); £spaces£ £/spaces£if(!strcmp(db_passwd,"0")) £spaces£ £/spaces£exit (0); £spaces£ £/spaces£ /*Get owner name and put it between quotes*/ £spaces£ £/spaces£sprintf(owner_name,"%c",'0'); £spaces£ £/spaces£printf("\nEnter schema owner name (0 to quit): "); £spaces£ £/spaces£gets(owner_name); £spaces£ £/spaces£if(!strcmp(owner_name,"0")) £spaces£ £/spaces£exit (0); £spaces£ £/spaces£sprintf(quoted_owner_name,"'%s'",owner_name); £spaces£ £/spaces£ /*Get role name*/ £spaces£ £/spaces£sprintf(role_name,"%c",'0'); £spaces£ £/spaces£printf("\nEnter role name (0 to quit): "); £spaces£ £/spaces£gets(role_name); £spaces£ £/spaces£if(!strcmp(role_name,"0")) £spaces£ £/spaces£exit (0); £spaces£ £/spaces£ /* Connect to ORACLE. */ £spaces£ £/spaces£ £spaces£ £/spaces£sprintf(db_passwd,"%s",'sys'); £spaces£ £/spaces£ £spaces£ £/spaces£sprintf(uid,"%s/%s",db_username,db_passwd); £spaces£ £/spaces£ £spaces£ £/spaces£EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--"); £spaces£ £/spaces£EXEC SQL CONNECT :uid IN SYSDBA MODE; £spaces£ £/spaces£printf("\nConnected to ORACLE as user: %s\n", db_username); £spaces£ £/spaces£EXEC SQL DECLARE ALL_TABLES TABLE (TABLE_NAME VARCHAR2(30) , OWNER VARCHAR2(30)); /*retrieve table list in a cursor predefined structure*/ £spaces£ £/spaces£EXEC SQL DECLARE table_cursor CURSOR FOR £spaces£ £/spaces£SELECT TABLE_NAME FROM ALL_TABLES £spaces£ £/spaces£WHERE owner = :quoted_owner_name; £spaces£ £/spaces£EXEC SQL OPEN table_cursor; /*Create role*/ //DDL statements can't be specified with host variables in it. £spaces£ £/spaces£ £spaces£ £/spaces£sprintf(CreateRole, "EXEC SQL CREATE ROLE %s", role_name); £spaces£ £/spaces£EXEC SQL PREPARE q FROM :CreateRole; £spaces£ £/spaces£EXEC SQL EXECUTE q; /*Grant privileges to role*/ £spaces£ £/spaces£sprintf(GrantCreateSession, "EXEC SQL GRANT CREATE SESSION TO %s", role_name); £spaces£ £/spaces£EXEC SQL PREPARE q FROM :GrantCreateSession; £spaces£ £/spaces£EXEC SQL EXECUTE q; £spaces£ £/spaces£sprintf(GrantCreateTable, "EXEC SQL GRANT CREATE TABLE TO %s", role_name); £spaces£ £/spaces£EXEC SQL PREPARE q FROM :GrantCreateTable; £spaces£ £/spaces£EXEC SQL EXECUTE q; £spaces£ £/spaces£sprintf(GrantCreateView, "EXEC SQL GRANT CREATE VIEW TO %s", role_name); £spaces£ £/spaces£EXEC SQL PREPARE q FROM :GrantCreateView; £spaces£ £/spaces£EXEC SQL EXECUTE q; £spaces£ £/spaces£sprintf(GrantCreateTrigger, "EXEC SQL GRANT CREATE TRIGGER TO %s", role_name); £spaces£ £/spaces£EXEC SQL PREPARE q FROM :GrantCreateTrigger; £spaces£ £/spaces£EXEC SQL EXECUTE q; £spaces£ £/spaces£for (;;) £spaces£ £/spaces£{ £spaces£ £/spaces£EXEC SQL FETCH :table_cursor £spaces£ £/spaces£INTO :table_record; £spaces£ £/spaces£ £spaces£ £/spaces£sprintf(table_fqn, "%s.%s", owner_name, table_record); £spaces£ £/spaces£ £spaces£ £/spaces£sprintf(GrantUpdate, "EXEC SQL GRANT UPDATE ON %s",table_fqn ," TO %s", role_name); £spaces£ £/spaces£EXEC SQL PREPARE q FROM :GrantUpdate; £spaces£ £/spaces£EXEC SQL EXECUTE q; £spaces£ £/spaces£ £spaces£ £/spaces£sprintf(GrantInsert, "EXEC SQL GRANT INSERT ON %s",table_fqn ," TO %s", role_name); £spaces£ £/spaces£EXEC SQL PREPARE q FROM :GrantInsert; £spaces£ £/spaces£EXEC SQL EXECUTE q; £spaces£ £/spaces£ £spaces£ £/spaces£sprintf(GrantSelect, "EXEC SQL GRANT SELECT ON %s",table_fqn ," TO %s", role_name); £spaces£ £/spaces£EXEC SQL PREPARE q FROM :GrantSelect; £spaces£ £/spaces£EXEC SQL EXECUTE q; £spaces£ £/spaces£ £spaces£ £/spaces£sprintf(GrantAlter, "EXEC SQL GRANT Alter ON %s",table_fqn ," TO %s", role_name); £spaces£ £/spaces£EXEC SQL PREPARE q FROM :GrantAlter; £spaces£ £/spaces£EXEC SQL EXECUTE q; £spaces£ £/spaces£} £spaces£ £/spaces£ £spaces£ £/spaces£EXEC SQL CLOSE :table_cursor; /*Role granting*/ £spaces£ £/spaces£sprintf(GrantRoleToUser, "EXEC SQL GRANT %s",role_name ," TO %s", owner_name); £spaces£ £/spaces£EXEC SQL PREPARE q FROM :GrantRoleToUser; £spaces£ £/spaces£EXEC SQL EXECUTE q; £spaces£ £/spaces£ £spaces£ £/spaces£sprintf(SetDefaultRole, "EXEC SQL ALTER USER %s",owner_name," DEFAULT ROLE %s", role_name); £spaces£ £/spaces£EXEC SQL PREPARE q FROM :SetDefaultRole; £spaces£ £/spaces£EXEC SQL EXECUTE q; £spaces£ £/spaces£printf("\nArrivederci.\n\n"); £spaces£ £/spaces£EXEC SQL COMMIT WORK RELEASE; £spaces£ £/spaces£exit(EXIT_SUCCESS); }

AltStyle によって変換されたページ (->オリジナル) /