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
不工作?
存储过程替换 View 。整个
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 中的任何类型的错误。有什么方法可以让 replace view
在 SP 编译时进行验证?
- 最后 - 关于通过 BTEQ 导出 DDL
DB.TB
之间有一个额外的空格,比如"db"。 “tb”
现在,当我在 SQL 助手中执行相同的显示时 - 一切正常 - 没有空间。我必须再写一个 sed 来删除多余的空间。
View 和 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 返回的任何错误/警告(不知道为什么)。如果您想在任何错误/警告后停止,您可以简单地使用 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; 增加最大长度;
关于sql - Teradata BTEQ : IF conditon , 使用运行时实际参数验证 SP 编译并导出 DDL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35532165/