【发布时间】:2012-12-31 17:45:28
【问题描述】:
编辑:我认为可能无法将 EXISTS 与 IF THEN 一起使用,但我遇到了另一个问题,如何在 sql 语句中使用变量?
EXEC SQL EXECDIRECT CREATE CATALOG CATALOG_NAME;
创建名称为“CATALOG_NAME”的目录,而不是存储在变量中的目录。 我知道在 MSSQL 中你可以这样做:
EXEC('CREATE DATABASE ' + '$(DBNAME)')
SolidDB sql 中的等价物是什么?
我正在尝试创建一个soliddb sql存储过程,它接受输入并根据这些输入执行特定的sql语句。我的代码如下:
"CREATE PROCEDURE ACTION
(OPTION VARCHAR, CATALOG_NAME VARCHAR)
BEGIN
IF OPTION= 'create' THEN
IF EXISTS (SELECT * FROM sys_catalogs WHERE name=CATALOG_NAME) THEN
EXEC SQL EXECDIRECT DROP CATALOG CATALOG_NAME;
END IF
EXEC SQL EXECDIRECT CREATE CATALOG CATALOG_NAME;
ELSEIF OPTION= 'drop' THEN
IF EXISTS (SELECT * FROM sys_catalogs WHERE name=CATALOG_NAME) THEN
EXEC SQL EXECDIRECT DROP CATALOG CATALOG_NAME;
END IF
END IF
END";
当我尝试使用
执行脚本文件时solsql -f "C:\solidb.sql" "dba" "dba"
我收到错误:
SOLID Procedure Error 23004: Syntax error: syntax error, line 6
我在注释掉 If EXISTS 行的情况下测试了代码,其他一切似乎都工作正常,所以我确定它的 IF EXISTS 行不正确。
所以我的问题是有可能做我想做的事情吗?如果是这样,你能告诉我正确的语法吗?提前谢谢!
【问题讨论】:
-
逻辑看起来很奇怪:“如果存在do_create”+“如果存在do_drop”其中一个肯定是错误的。
DROP CATALOG CATALOGNAME也有错别字 -->DROP CATALOG CATALOG_NAME -
感谢您注意到错字,我现在已经修正了。这里的逻辑是检查要创建的数据库/目录是否已经存在,如果是,则在创建之前先将其删除。如果要删除的目录存在,则删除它,否则什么也不做。
-
我首先将 asterix 替换为 1:
IF EXISTS (SELECT 1 FROM sys_catalogs WHERE name=CATALOG_NAME)。顺便说一句:你没有提到你的 DBMS 平台。 -
它的 IBM SolidDB v7,我有另一个关于在 sql 语句中使用变量的问题。 EXEC SQL EXECDIRECT DROP CATALOG CATALOG_NAME;这实际上创建了一个名为“CATALOG_NAME”的目录,我如何使用实际存储在变量 CATALOG_NAME 中的字符,谢谢。
-
将 asterix 更改为 1 也不起作用 ={
标签: sql stored-procedures