如何在存储过程中创建视图
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在存储过程中创建视图相关的知识,希望对你有一定的参考价值。
create or replace procedure test_00
is
begin
execute immediate '
create or replace view xx99as
select uni_no, name, ''»ù±¾¹¤×Ê'' amtName, A1 Amt from gz_fd.salary1998 t where uni_no = ''22961''
union all
select uni_no, name, ''¹¤×ÊË°½ðxx'' amtName, A3 Amt from gz_fd.salary1998 t where uni_no = ''22961''';
end;
报缺失表达式的错误。用v_sql也试过了。单独创建视图是可以的
IF OBJECT_ID('sptest') IS NOT NULL
DROP PROCEDURE sptest;
GO
CREATE PROCEDURE sptest
AS
BEGIN
DECLARE @str VARCHAR(max);
SET @str='CREATE VIEW vtest AS SELECT * FROM dbo.users';
EXEC (@str)
END;
--调用
EXEC sptest;
没有报错,可以运行。
创建一个 MYSQL 存储过程以在不同的数据库中创建表
【中文标题】创建一个 MYSQL 存储过程以在不同的数据库中创建表【英文标题】:Create a MYSQL stored proc to create table in a different database 【发布时间】:2020-11-23 17:41:58 【问题描述】:我正在尝试创建一个可以跨多个数据库使用但不必在所有数据库中复制存储过程的存储过程。
示例:在 BIZ_ADM 中有可以运行的存储过程,并且可以将参数传递给它,从而在另一个数据库 BIZ_OPS 中创建表和视图
CALL CreateNewEntity1
('KTC_SHARED', 'TEST1', 'SHARED');
分隔符 $$
使用KTC_SHARED
$$
如果存在则删除程序CreateNewEntity1
$$
CREATE DEFINER=root
@192.168.0.%
PROCEDURE CreateNewEntity1
(IN databaseNameSTR VARCHAR (64), IN entityNameSTR VARCHAR(64), IN extSTR VARCHAR(64))
开始
SET @sqlSTR = CONCAT("CREATE TABLE TBL_", entityNameSTR, "
(标准字段等)
如果要在当前数据库中创建,我可以做任何事情,但在尝试在不同的数据库中创建时不起作用。希望这足以清楚地了解我要做什么。
提前感谢您提供的任何帮助。
【问题讨论】:
忘了说,不要跨多个数据库复制,因为这个存储过程会被频繁使用。 【参考方案1】:从 CLI 窗口复制:
Server version: 8.0.21 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> USE test
Database changed
mysql> CREATE DATABASE test1;
Query OK, 1 row affected (0.15 sec)
mysql> DELIMITER ;;
mysql> CREATE PROCEDURE test1.createtable (IN db VARCHAR(64), IN tb VARCHAR(64))
-> BEGIN
-> SET @sql:=CONCAT('CREATE TABLE ', db, '.', tb, '(id INT, val INT);');
-> PREPARE stmt FROM @sql;
-> EXECUTE stmt;
-> DROP PREPARE stmt;
-> END; ;;
Query OK, 0 rows affected (0.19 sec)
mysql> DELIMITER ;
mysql> SHOW TABLES;
Empty set (0.09 sec)
mysql> CALL test1.createtable('test', 'test');
Query OK, 0 rows affected (0.66 sec)
mysql> SHOW TABLES FROM test;
+----------------+
| Tables_in_test |
+----------------+
| test |
+----------------+
1 row in set (0.11 sec)
mysql>
【讨论】:
Akina,感谢您的回复。为了清楚起见,我希望能够从任何数据库运行存储过程,并让它在我作为参数列出的任何数据库中创建表和视图。您的回复会这样做还是我仍然必须在每个数据库中都有存储过程?谢谢 @dcbk 仔细看 - SP 不是在当前数据库中创建的。没有什么能阻止将 DB1 设为当前并从 DB2 执行 SP,从而在 DB3 中创建一个表。以上是关于如何在存储过程中创建视图的主要内容,如果未能解决你的问题,请参考以下文章