SPExtract.ibeblock
execute ibeblock ExtractProcedures (
CodeDir varchar(1000) = 'E:\IBEBlocks\' comment 'Path to necessary IBEBlocks',
CreateAlter varchar(6) = 'CREATE',
Dialect smallint = 3,
EmptyBody Boolean = FALSE,
FileStrm variant)
as
begin
CRLF = ibec_CRLF;
WriteDDLBlock =
'execute ibeblock (sName variant, sDDL variant, sInParams variant, sOutParams variant, sSrc variant, FS variant)
as
CRLF = ibec_CRLF();
if (sInParams <> '''') then
sDDL = sDDL || '' ('' || CRLF || '' '' || ibec_Trim(sInParams) || '')'';
if (sOutParams <> '''') then
sDDL = sDDL || CRLF || ''RETURNS ('' || CRLF || '' '' || ibec_Trim(sOutParams) || '')'';
sDDL = sDDL || CRLF || ''AS'' || CRLF;
sDDL = sDDL || sSrc || ''^'';
ibec_progress(''Writing procedure '' || sName);
ibec_fs_Writeln(FS, sDDL); ibec_fs_Writeln(FS, ''''); ibec_fs_Writeln(FS, '''');
end';
RdbPrecisionExists = TRUE;
FldTypeFunc = ibec_LoadFromFile(CodeDir || 'FldType.ibeblock');
sName = ''; sDDL = ''; sInParams = ''; sOutParams = ''; sParam = ''; iPrec = 0;
if (FileStrm is not null) then
FS = FileStrm;
else
FS = ibec_fs_OpenFile('E:\BlockScript.sql', __fmCreate);
Stmt = ibec_Concat(
'select pr.rdb$procedure_name, ', CRLF, -- 0
' pp.rdb$parameter_name, ', CRLF, -- 1
' pp.rdb$parameter_type, ', CRLF, -- 2
' fs.rdb$field_name, ', CRLF, -- 3
' fs.rdb$field_type, ', CRLF, -- 4
' fs.rdb$field_length, ', CRLF, -- 5
' fs.rdb$field_scale, ', CRLF, -- 6
' fs.rdb$field_sub_type, ', CRLF, -- 7
' fs.rdb$segment_length, ', CRLF, -- 8
' fs.rdb$dimensions, ', CRLF, -- 9
' cr.rdb$character_set_name,', CRLF, -- 10
' co.rdb$collation_name, ', CRLF, -- 11
' pp.rdb$parameter_number, ', CRLF, -- 12
' fs.rdb$character_length, ', CRLF, -- 13
' fs.rdb$default_source ', CRLF); -- 14
if (not EmptyBody) then
Stmt = ibec_Trim(Stmt) || ',' || CRLF || ' pr.rdb$procedure_source' || CRLF;
else
sSrc = 'BEGIN' || CRLF || ' EXIT;' || CRLF || 'END';
if (RdbPrecisionExists) then
Stmt = ibec_Trim(Stmt) || ',' || CRLF ||
' fs.rdb$field_precision' || CRLF;
Stmt = Stmt ||
'from rdb$procedures pr' || CRLF ||
'left join rdb$procedure_parameters pp on pp.rdb$procedure_name = pr.rdb$procedure_name' || CRLF ||
'left join rdb$fields fs on fs.rdb$field_name = pp.rdb$field_source' || CRLF ||
'left join rdb$character_sets cr on fs.rdb$character_set_id = cr.rdb$character_set_id' || CRLF ||
'left join rdb$collations co on ((fs.rdb$collation_id = co.rdb$collation_id) and' || CRLF ||
' (fs.rdb$character_set_id = co.rdb$character_set_id))' || CRLF ||
'order by pr.rdb$procedure_name, pp.rdb$parameter_type, pp.rdb$parameter_number';
SetTermWritten = FALSE;
for execute statement :Stmt into :SPProps
do
begin
if (SetTermWritten = FALSE) then
begin
ibec_fs_Writeln(FS, 'SET TERM ^ ;' || CRLF);
SetTermWritten = TRUE;
end;
if (RdbPrecisionExists = TRUE) then
iPrec = ibec_IIF(EmptyBody = 1, SPProps[15], SPProps[16]);
SPName = ibec_Trim(SPProps[0]);
if (sName <> SPName) then
begin
if (sDDL <> '') then
execute ibeblock WriteDDLBlock(sName, sDDL, sInParams, sOutParams, sSrc, FS);
sName = SPName;
if (not EmptyBody) then
sSrc = ibec_Trim(SPProps[15]);
sDDL = CreateAlter || ' PROCEDURE ' || SPName;
sInParams = ''; sOutParams = ''; sParam = '';
end
if (SPProps[1] is not null) then
begin
execute ibeblock FldTypeFunc(SPProps[4], SPProps[7], SPProps[5], SPProps[6], SPProps[8],
SPProps[13], SPProps[16], Dialect)
returning_values :sParam;
sParam = ibec_Trim(SPProps[1]) || ' ' || sParam;
-- Character Set
if ((SPProps[4] in (14, 37, 261)) and (SPProps[10] is not null)) then
sParam = sParam || ' CHARACTER SET ' || ibec_trim(SPProps[10]);
-- Default Value
if ((SPProps[14] is not null) and (SPProps[14] <> '')) then
sParam = sParam || ' DEFAULT ' || ibec_trim(SPProps[14]);
if (SPProps[2] = 0) then
begin
if (sInParams <> '') then
sInParams = sInParams || ',' || CRLF || ' ';
sInParams = sInParams || sParam;
end
else if (SPProps[2] = 1) then
begin
if (sOutParams <> '') then
sOutParams = sOutParams || ',' || CRLF || ' ';
sOutParams = sOutParams || sParam;
end
end
end
if (sDDL <> '') then
execute ibeblock WriteDDLBlock(sName, sDDL, sInParams, sOutParams, sSrc, FS);
if (SetTermWritten) then
ibec_fs_Writeln(FS, 'SET TERM ; ^' || CRLF);
if (FileStrm is null) then
ibec_fs_CloseFile(FS);
end
back to top of page
<< GensExtract.ibeblock | IBEBlock | RunMe.ibeblock >>







