基于顶点集合的视图
View based on apex collection
在我的应用程序中,我有一个基于顶点集合的视图:
CREATE OR REPLACE FORCE VIEW "INGREDIENTS_VW" ("Food_name", "Weight", "Protein", "Carbohydrates", "Fat", "Calories", "Food_id", "Dish_id") AS
SELECT c001 as "Food_name"
,c002 as "Weight"
,c003 as "Protein"
,c004 as "Carbohydrates"
,c005 as "Fat"
,c006 as "Calories"
,c007 as "Food_id"
,c008 as "Dish_id"
FROM APEX_collections
WHERE collection_name = 'INGREDIENTS_COLL'
/
我知道它作为报告来源工作正常。问题是当我尝试使用具有基于此视图的 select 的插入语句的过程编译包时:
Compilation failed,line 95 (10:07:41)
PL/SQL: ORA-00904: "DISH_ID": invalid identifierCompilation failed,line 87 (10:07:41)
PL/SQL: SQL Statement ignored
这是程序包和程序:
create or replace package body "INGREDIENTS_PKG" is
...
PROCEDURE submit_ingredients(p_dish_id IN NUMBER) IS
BEGIN
INSERT INTO food_dishes
SELECT dish_id
,food_id
,weight
FROM ((SELECT dish_id
,food_id
,weight
FROM **ingredients_vw**
WHERE dish_id = p_dish_id) MINUS
(SELECT dish_id
,food_id
,weight
FROM food_dishes
WHERE dish_id = p_dish_id));
END submit_ingredients;
end "INGREDIENTS_PKG";
你能告诉我如何处理这种问题吗?是否可以使用此视图强制进行编译,以便在运行时可以正常运行?或者可能无法编译此包?
您在强制视图中明确定义的别名可能与其调用方式不匹配:
c008 as "Dish_id"
查看 SQL 查询调用:
PL/SQL: ORA-00904: "DISH_ID": 无效标识符
注意,
"Dish_id" != "DISH_ID"
这些引号提醒人们注意您的名字是如何被解读的。没有引号使它不具体。
所以全部加盖或 mg init ca。菜上桌了。 {客户满意吗?}
"DISH_ID" 是无效标识符。您的视图使用带引号的混合大小写标识符,因此数据字典中的列名称为 "Dish_id"。当您引用标识符时,您必须引用所有对它们的引用:
INSERT INTO food_dishes
SELECT "Dish_id"
,"Food_id"
,"Weight"
FROM ((SELECT "Dish_id"
,"Food_id"
,"Weight"
FROM ingredients_vw
WHERE "Dish_id" = p_dish_id) MINUS
(SELECT "Dish_id"
,"Food_id"
,"Weight"
FROM food_dishes
WHERE "Dish_id" = p_dish_id));
我假设您还在 food_dishes
中使用了带引号的标识符,但如果没有,请从 minus
部分中删除双引号。 Read more about quoted and non-quoted identifiers..
为了清楚起见并避免潜在的错误,您实际上也应该在插入中指定列名(再次假设标识符也在 table 中被引用):
INSERT INTO food_dishes (
"Dish_id"
,"Food_id"
,"Weight")
SELECT "Dish_id"
,"Food_id"
,"Weight"
...
在我的应用程序中,我有一个基于顶点集合的视图:
CREATE OR REPLACE FORCE VIEW "INGREDIENTS_VW" ("Food_name", "Weight", "Protein", "Carbohydrates", "Fat", "Calories", "Food_id", "Dish_id") AS
SELECT c001 as "Food_name"
,c002 as "Weight"
,c003 as "Protein"
,c004 as "Carbohydrates"
,c005 as "Fat"
,c006 as "Calories"
,c007 as "Food_id"
,c008 as "Dish_id"
FROM APEX_collections
WHERE collection_name = 'INGREDIENTS_COLL'
/
我知道它作为报告来源工作正常。问题是当我尝试使用具有基于此视图的 select 的插入语句的过程编译包时:
Compilation failed,line 95 (10:07:41)
PL/SQL: ORA-00904: "DISH_ID": invalid identifierCompilation failed,line 87 (10:07:41)
PL/SQL: SQL Statement ignored
这是程序包和程序:
create or replace package body "INGREDIENTS_PKG" is
...
PROCEDURE submit_ingredients(p_dish_id IN NUMBER) IS
BEGIN
INSERT INTO food_dishes
SELECT dish_id
,food_id
,weight
FROM ((SELECT dish_id
,food_id
,weight
FROM **ingredients_vw**
WHERE dish_id = p_dish_id) MINUS
(SELECT dish_id
,food_id
,weight
FROM food_dishes
WHERE dish_id = p_dish_id));
END submit_ingredients;
end "INGREDIENTS_PKG";
你能告诉我如何处理这种问题吗?是否可以使用此视图强制进行编译,以便在运行时可以正常运行?或者可能无法编译此包?
您在强制视图中明确定义的别名可能与其调用方式不匹配:
c008 as "Dish_id"
查看 SQL 查询调用: PL/SQL: ORA-00904: "DISH_ID": 无效标识符
注意,
"Dish_id" != "DISH_ID"
这些引号提醒人们注意您的名字是如何被解读的。没有引号使它不具体。
所以全部加盖或 mg init ca。菜上桌了。 {客户满意吗?}
"DISH_ID" 是无效标识符。您的视图使用带引号的混合大小写标识符,因此数据字典中的列名称为 "Dish_id"。当您引用标识符时,您必须引用所有对它们的引用:
INSERT INTO food_dishes
SELECT "Dish_id"
,"Food_id"
,"Weight"
FROM ((SELECT "Dish_id"
,"Food_id"
,"Weight"
FROM ingredients_vw
WHERE "Dish_id" = p_dish_id) MINUS
(SELECT "Dish_id"
,"Food_id"
,"Weight"
FROM food_dishes
WHERE "Dish_id" = p_dish_id));
我假设您还在 food_dishes
中使用了带引号的标识符,但如果没有,请从 minus
部分中删除双引号。 Read more about quoted and non-quoted identifiers..
为了清楚起见并避免潜在的错误,您实际上也应该在插入中指定列名(再次假设标识符也在 table 中被引用):
INSERT INTO food_dishes (
"Dish_id"
,"Food_id"
,"Weight")
SELECT "Dish_id"
,"Food_id"
,"Weight"
...