在我的应用程序中,我有一个基于apex集合的视图:
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的insert语句的过程编译包时:
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";
你能告诉我如何处理这类问题吗?是否可以使用此视图强制执行编译,以便在运行时它可以正常?或者也许没有办法编译这个包?
答案 0 :(得分:2)
" DISH_ID"是无效的标识符。您的视图使用带引号的混合大小写标识符,因此数据字典中的列名称为" Dish_id"。如果您有引用标识符,则必须引用它们的所有引用:
public class OracleCaller
{
public void A()
{
C();
}
[System.ObsoleteAttribute("OracleConnection has been deprecated. http://go.microsoft.com/fwlink/?LinkID=144260", false)]
private void C()
{
D();
}
[System.ObsoleteAttribute("OracleConnection has been deprecated. http://go.microsoft.com/fwlink/?LinkID=144260", false)]
private void D()
{
E();
}
[System.ObsoleteAttribute("OracleConnection has been deprecated. http://go.microsoft.com/fwlink/?LinkID=144260", false)]
private void E()
{
System.Data.OracleClient.OracleCommand c = new System.Data.OracleClient.OracleCommand();
}
}
我假设您在 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
部分删除双引号。 Read more about quoted and non-quoted identifiers.
为了清晰起见,您还应该在插入中指定列名,以避免潜在的错误(同样假设标识符也在表中引用):
minus
答案 1 :(得分:0)
强制视图中显式定义的别名可能与调用它的方式不匹配:
c008 as "Dish_id"
查看SQL查询调用: PL / SQL:ORA-00904:" DISH_ID" :标识符无效
请注意,
"Dish_id" != "DISH_ID"
引号提醒您注意您的姓名的读取方式。没有引号使其不具体。
所以将它全部封顶或者用mg封顶。提供菜肴。 {客户满意吗?}