Teradata BTEQ:IF 条件,使用运行时实际参数验证 SP 编译并导出 DDL
Teradata BTEQ : IF conditon , Validate SP compilation with runtime actual parameters & export DDL
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
和 [=13= 忽略文件的其余部分] 说
但这并没有发生
.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有问题e.g.而不是 Col1 我会把 Co l1 放在 SP 将编译。可以理解的是,存储过程调用的 运行 时间结果在编译时不会被评估。这导致无法检测到生成的 replace view
DDL 中的任何类型的错误。有什么办法可以让 replace view
在 SP 编译时进行验证?
- 最后-关于通过 BTEQ 导出 DDL
DB.TB
之间有一个额外的 space 就像 "db". "tb"
现在当我在 SQL 助手中做同样的节目时 - 一切都很好 - 没有 space。我必须写另一个 sed 来删除额外的 space 。
视图和 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
Q1:BTEQ 简单地忽略了 DBMS 返回的任何 error/warning(不知道为什么)。如果你想在任何 error/warning 之后停止,你可以简单地使用 ACTIVITYCOUNT
而不是 ERRORCODE
:
.compile file=sp1 ;
.IF ACTIVITYCOUNT > 0 THEN .GOTO SQLERROR;
如果你想忽略警告,我不知道不先删除 SP 的可靠方法:
DROP PROCEDURE whatever;
.compile file=sp1 ; -- creates SP whatever
HELP PROCEDURE whatever ATTR;
.IF ERRORCODE = 5495 THEN .GOTO SQLERROR; -- 5495 = SP doesn't exist
Q2:无法验证动态 SQL,顾名思义,它是动态的,在实际提交之前对 DBMS 是未知的。
Q3:限定名称中句号周围的空格不会导致错误,db . td
很乐意被解析器接受。
foo_bar
不应跨行拆分,除非行太宽,只需使用 .set width 30000;
增加最大长度
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
和 [=13= 忽略文件的其余部分] 说
但这并没有发生.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有问题e.g.而不是 Col1 我会把 Co l1 放在 SP 将编译。可以理解的是,存储过程调用的 运行 时间结果在编译时不会被评估。这导致无法检测到生成的 replace view
DDL 中的任何类型的错误。有什么办法可以让 replace view
在 SP 编译时进行验证?
- 最后-关于通过 BTEQ 导出 DDL
DB.TB
之间有一个额外的 space 就像"db". "tb"
现在当我在 SQL 助手中做同样的节目时 - 一切都很好 - 没有 space。我必须写另一个 sed 来删除额外的 space 。
视图和 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
Q1:BTEQ 简单地忽略了 DBMS 返回的任何 error/warning(不知道为什么)。如果你想在任何 error/warning 之后停止,你可以简单地使用 ACTIVITYCOUNT
而不是 ERRORCODE
:
.compile file=sp1 ;
.IF ACTIVITYCOUNT > 0 THEN .GOTO SQLERROR;
如果你想忽略警告,我不知道不先删除 SP 的可靠方法:
DROP PROCEDURE whatever;
.compile file=sp1 ; -- creates SP whatever
HELP PROCEDURE whatever ATTR;
.IF ERRORCODE = 5495 THEN .GOTO SQLERROR; -- 5495 = SP doesn't exist
Q2:无法验证动态 SQL,顾名思义,它是动态的,在实际提交之前对 DBMS 是未知的。
Q3:限定名称中句号周围的空格不会导致错误,db . td
很乐意被解析器接受。
foo_bar
不应跨行拆分,除非行太宽,只需使用 .set width 30000;