首页 文章

Teradata BTEQ:IF conditon,使用运行时实际参数和导出DDL验证SP编译

提问于
浏览
1

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 条件应该捕获它,并且应该忽略文件的其余部分 .LABELSQLERROR 表示
    但这不会发生
.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 回答

  • 1

    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实际提交之前是未知的 .

    问题3:限定名称中的句点周围的空格不会导致错误,解析器很乐意接受 db . td .

    foo_bar 不应跨行分割,除非行太宽,只需使用 .set width 30000; 增加最大长度

相关问题