Oracle SQL - 如何根据 select 语句定义日期绑定变量
Oracle SQL - How to define a date bind variable based on a select statement
使用 Oracle SQL,我有几个 SQL 带有手动绑定变量的查询,用于创建 table,如下所示:
我想做的是将 define anfang 更改为 (select c_year_beginning from master_date_automation).
我已经尝试了几种绑定变量的组合,但无法使其工作(使用 DEL 注释编辑):
begin
execute immediate 'DROP TABLE A_TEST_TABLE'
end;
/
begin
execute immediate 'create table A_TEST_TABLE (
user varchar2(100),
product varchar2(100),
datum date)';
end;
/
BEGIN
DECLARE
v_c_year_ytd DATE;
BEGIN
SELECT c_year_ytd Into v_c_year_ytd FROM master_date_automation;
BEGIN
SELECT usr.datum || ','
|| usr.user || ','
|| usr.product
INTO A_TEST_TABLE
FROM users_table usr
WHERE usr.datum = v_c_year_ytd
AND kto.kontonummer = '00510199065';
END;
END;
END;
错误消息(删除评论后编辑):
Error report -
ORA-06550: line 12, column 6:
PLS-00403: expression 'A_TEST_TABLE' cannot be used as an INTO-target of a SELECT/FETCH statement
ORA-06550: line 12, column 21:
PL/SQL: ORA-00904: : invalid identifier
ORA-06550: line 9, column 1:
PL/SQL: SQL Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
如果有人能帮助我,我将不胜感激。
万分感谢!
因此,总结我上面的评论,您不需要 PL/SQL
来执行此操作。您可以直接使用 SQL
:
完成所有脚本
CREATE TABLE A_TEST_TABLE
(
user varchar2(100),
product varchar2(100),
datum date
);
INSERT INTO a_test_table
SELECT usr.user,
usr.product,
usr.datum
FROM users_table
WHERE usr.datum = (SELECT c_year_ytd FROM master_date_automation)
AND usr.user= '123456789'
如果需要先删除 table。
您不需要在 PL/SQL 块中使用动态 SQL 来创建表;你可以使用 SQL 语句来做到这一点:
DROP TABLE A_TEST_TABLE;
CREATE TABLE A_TEST_TABLE (
user_name varchar2(100),
product varchar2(100),
datum date
);
注意:USER
是一个保留字,您不能将它用作不带引号的标识符;您将需要找到另一个标识符,例如 user_name
,或者您将不得不使用带引号的标识符,并在任何使用它的地方都将其称为 "USER"
(但是,这是不好的做法)。
那么如果你想使用PL/SQL你可以使用:
DECLARE
v_c_year_ytd DATE;
BEGIN
SELECT c_year_ytd
Into v_c_year_ytd
FROM master_date_automation;
INSERT INTO a_test_table (datum, user_name, product)
SELECT datum,
user_name
product
FROM users_table
WHERE datum = v_c_year_ytd
AND kontonummer = '00510199065';
END;
/
但是只使用一个 SQL 语句会简单得多:
INSERT INTO a_test_table (datum, user_name, product)
SELECT datum,
user_name
product
FROM users_table
WHERE datum = (SELECT c_year_ytd FROM master_date_automation)
AND kontonummer = '00510199065';
使用 Oracle SQL,我有几个 SQL 带有手动绑定变量的查询,用于创建 table,如下所示:
我想做的是将 define anfang 更改为 (select c_year_beginning from master_date_automation).
我已经尝试了几种绑定变量的组合,但无法使其工作(使用 DEL 注释编辑):
begin
execute immediate 'DROP TABLE A_TEST_TABLE'
end;
/
begin
execute immediate 'create table A_TEST_TABLE (
user varchar2(100),
product varchar2(100),
datum date)';
end;
/
BEGIN
DECLARE
v_c_year_ytd DATE;
BEGIN
SELECT c_year_ytd Into v_c_year_ytd FROM master_date_automation;
BEGIN
SELECT usr.datum || ','
|| usr.user || ','
|| usr.product
INTO A_TEST_TABLE
FROM users_table usr
WHERE usr.datum = v_c_year_ytd
AND kto.kontonummer = '00510199065';
END;
END;
END;
错误消息(删除评论后编辑):
Error report -
ORA-06550: line 12, column 6:
PLS-00403: expression 'A_TEST_TABLE' cannot be used as an INTO-target of a SELECT/FETCH statement
ORA-06550: line 12, column 21:
PL/SQL: ORA-00904: : invalid identifier
ORA-06550: line 9, column 1:
PL/SQL: SQL Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
如果有人能帮助我,我将不胜感激。
万分感谢!
因此,总结我上面的评论,您不需要 PL/SQL
来执行此操作。您可以直接使用 SQL
:
CREATE TABLE A_TEST_TABLE
(
user varchar2(100),
product varchar2(100),
datum date
);
INSERT INTO a_test_table
SELECT usr.user,
usr.product,
usr.datum
FROM users_table
WHERE usr.datum = (SELECT c_year_ytd FROM master_date_automation)
AND usr.user= '123456789'
如果需要先删除 table。
您不需要在 PL/SQL 块中使用动态 SQL 来创建表;你可以使用 SQL 语句来做到这一点:
DROP TABLE A_TEST_TABLE;
CREATE TABLE A_TEST_TABLE (
user_name varchar2(100),
product varchar2(100),
datum date
);
注意:USER
是一个保留字,您不能将它用作不带引号的标识符;您将需要找到另一个标识符,例如 user_name
,或者您将不得不使用带引号的标识符,并在任何使用它的地方都将其称为 "USER"
(但是,这是不好的做法)。
那么如果你想使用PL/SQL你可以使用:
DECLARE
v_c_year_ytd DATE;
BEGIN
SELECT c_year_ytd
Into v_c_year_ytd
FROM master_date_automation;
INSERT INTO a_test_table (datum, user_name, product)
SELECT datum,
user_name
product
FROM users_table
WHERE datum = v_c_year_ytd
AND kontonummer = '00510199065';
END;
/
但是只使用一个 SQL 语句会简单得多:
INSERT INTO a_test_table (datum, user_name, product)
SELECT datum,
user_name
product
FROM users_table
WHERE datum = (SELECT c_year_ytd FROM master_date_automation)
AND kontonummer = '00510199065';