我的目标是使用雪花过程将表从一个数据库复制到另一个数据库,这样我就可以随时重复这个过程。在第一个数据库中,有一个包含所有表名的表。当在第二个数据库中存储表时,我想在模式名称之前添加USERNAME作为过程的参数。例如:
第一个数据库:database.schema_name.table_name
第二个数据库:database. username_schema_name .table_name
以下代码
CREATE OR REPLACE PROCEDURE COPY_TABLES_TO_SANDBOX(USERNAME VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
AS
DECLARE
SRC_DB VARCHAR := 'FIRST_DATABASE';
SRC_SCHEMA VARCHAR := 'SCHEMA_NAME';
TRG_DB VARCHAR := 'SECOND_DATABASE';
TAB_NAME VARCHAR;
C1 CURSOR FOR
SELECT USERNAME || '_' || TABLE_SCHEMA || '.' || TABLE_NAME AS SCHEMA_TAB_NAME
FROM IDENTIFIER(SRC_DB) || '.' || IDENTIFIER(SRC_SCHEMA) || '.' ||
IDENTIFIER('TABLES')
WHERE TABLE_TYPE = 'BASE TABLE';
BEGIN
FOR REC IN C1 DO
TAB_NAME := REC.TAB_NAME;
EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE ' || IDENTIFIER(TRG_DB) || '.' ||
IDENTIFIER(TAB_NAME) || ' AS SELECT * FROM ' || IDENTIFIER(SCHEMA_TAB_NAME) || '
COPY GRANTS';
END FOR;
RETURN 'Tables copied successfully';
END;
CALL COPY_TABLES_TO_SANDBOX('USERNAME');
抛出错误:
SQL Error [1003] [42000]: SQL编译错误:第12行第20位出现语法错误'SRC_DB'。语法错误,第17行第12位出现意外的'IMMEDIATE'。语法错误,第17行第62位出现意外的'('。语法错误第17行69号位置意外')'.
我如何解决这个问题,或者在代码中可以改进什么?提前感谢
形成错误,它看起来像是在'SRC_DB'语法中,看起来当您使用IDENTIFIER时,您需要使用:,如"FROM IDENTIFIER(:SRC_DB)"
另一种选择是创建一个SQL字符串,将由Execute Immediate执行,并在错误的情况下捕获表中的字符串,这样您就可以查看SQL语句是否正确。