BTEQ相关问题 - 我正在通过BTEQ编制一份SP列表
.compile file=sp1 ;
.IF ERRORCODE <> 0 THEN .GOTO SQLERROR;
compile file=sp2 ;
.IF ERRORCODE <> 0 THEN .GOTO SQLERROR;
.logoff
.quit
.LABEL SQLERROR
.logoff ;
.quit ;
我对这些问题有以下问题
- 如果SP编译失败,则以下
.IF
条件应该捕获它,并且应该忽略文件的其余部分.LABEL
,SQLERROR
表示
但这不会发生
.compile file=sp1 ;
One Error/Warning.
Warning: 5526 Stored Procedure is not created/replaced due to error(s).
Total elapsed time was 1 second.
Errors reported during compilation
`---------------------------------------------------------------------------
SPL1076:E(L3), The right parenthesis in parameter declaration is missing.
+---------+---------+---------+---------+---------+---------+---------+----
.IF ERRORCODE <> 0 THEN .GOTO SQLERROR;
+---------+---------+---------+---------+---------+---------+---------+----
.compile file=sp2 ;
Procedure has been replaced.
Total elapsed time was 1 second.
为什么 IF
没有运作?
- 存储过程替换视图 . 整个
replace stored proc
语句是通过导出的show
生成的 . 我稍后会谈到 . 在SP内部代码是这样的
REPLACE PROCEDURE "DB"."TB"
(IN L_N2 VARCHAR(500),
IN L_N1 VARCHAR(500)
)
BEGIN
DECLARE returncode INTEGER DEFAULT 0;
DECLARE mystat VARCHAR(60000);
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SET RETURNCODE=1/0;
END
SET mystat='REPLACE VIEW '||L_N2||'.TBname ( VCol1,Vcol2)
As sel col1,col2
From '||L_N1||'.Tbname';
CALL dbc.sysexecsql(mystat);
END
即使Col1,Col2存在问题,例如而不是Col1我会把Co l1 SP编译 . 可以理解的是,存储过程调用的运行时结果在编译时不会被评估 . 这样就无法检测到生成的 replace view
DDL中的任何错误 . 有没有什么方法可以让我在SP编译时验证 replace view
?
- 最后 - 关于通过BTEQ出口DDL
DB.TB
之间有一个额外的空间,就像"db". "tb"
现在当我在SQL助手中做同样的节目时 - 一切都很好 - 没有空间 . 我必须写另一个sed以增加额外的空间 .
视图和SP代码非常长,并且通常在UNIX上,代码会被分割为新的行
sel foo_
bar, foobar,Col.
tb from db.tb
foo_bar is split across multiple lines .
# std BTEQ options are used. The \n is because I am echoing all this to file
.SET ECHOREQ OFF \n
.set width 500
.set titledashes off \n
.set format off \n
.set rtitle '' \n
.export report file="$ph" \n
show procedure $db.$tb ; \n
.export reset ; \n
1 回答
Q1:BTEQ只是忽略了DBMS返回的任何错误/警告(不知道为什么) . 如果您想在任何错误/警告后停止,您只需使用
ACTIVITYCOUNT
而不是ERRORCODE
:如果你想忽略警告我不知道一个可靠的方法而不先丢弃SP:
Q2:没有办法验证动态SQL,它是动态的,如名称所暗示的,并且在DBMS实际提交之前是未知的 .
问题3:限定名称中的句点周围的空格不会导致错误,解析器很乐意接受
db . td
.foo_bar
不应跨行分割,除非行太宽,只需使用.set width 30000;
增加最大长度