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

标签 sql database stored-procedures teradata 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 忽略文件的其余部分, 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/

相关文章:

php - CodeIgniter 正在复制 SQL 查询

c# - 如何为我的用户自己的电脑设置自己的 MySQL 数据库

MySQL存储过程从in参数设置动态查询

oracle - PL/SQL 嵌套过程异常处理

sql - 为什么 T-SQL where 语句的顺序很重要?

mysql - 数据库中的用户数据列表?

sql - 如何从sql server中包含html内容的字段中提取文件名?

database - 网站和数据库 View

Android,运行时查看SQLite数据库(不像其他题)

mysql - 在存储过程中的另一个 SELECT 中使用已返回的 SELECT