ANSI動態SQL方法4 :用於處理任何動態SQL語句和PL/SQL塊
處理SQL語句步驟:
1、分配輸入描述區和輸出描述區
EXEC SQL ALLOCATE DESCRIPTROR 'input_des';
EXEC SQL ALLOCATE DESCRIPTROR 'output_des';
2、準備SQL語句和定義遊標
gets(sql_stat);
EXEC SQL PREPARE S FROM :sql_stat;
EXEC SQL DECLARE C CURSOR FOR S;
3、處理綁定變量
EXEC SQL DESCRIBE INPUT S USING DESCRIPTOR 'input_des';
EXEC SQL GET DESCRIPTOR 'input_des' :input_count = COUNT;
ANSI_varchar_type = 12;
for(i=0;i < input_count;i++)
{
occurs = i+1;
EXEC SQL GET DESCRIPTOR 'input_des' VALUE :occurs :name = NAME;
gets(input_buf);
input_len = strlen(input_buf);
input_buf[input_len] = '\0';
EXEC SQL SET DESCRIPTOR 'input_des' VALUE :occurs TYPE = :ANSI_varchar_type,
LENGTH = :input_len,DATA = :input_buf;
}
4、打開遊標
EXEC SQL OPEN C USING DESCRIPTOR 'input_des';
5、處理查詢結果
EXEC SQL DESCRIBE OUTPUT S USING DESCRIPTOR 'output_des';
EXEC SQL GET DESCRIPTOR 'output_des' :output_count = COUNT;
type = 12;
len = 2000;
for(i=0;i < output_count;i++)
{
occurs = i+1;
EXEC SQL SET DESCRIPTOR 'output_des' VALUE :occurs TYPE=:type LENGTH=:len;
EXEC SQL GET DESCRIPTOR 'output_des' VALUE :occurs :name = NAME;
}
for(;;)
{
EXEC SQL FETCH C INTO DESCRIPTOR 'output_des';
for(i=0;i < output_count;i++)
{
occurs = i +1;
EXEC SQL GET DESCRIPTOR 'output_des'
VALUE:occurs :data = DATA,:indi = INDICATOR;
}
}
6、關閉遊標和釋放描述區
EXEC SQL CLOSE C;
EXEC SQL DEALLOCATE DESCRIPTOR 'input_des';
EXEC SQL DEALLOCATE DESCRIPTOR 'output_des';