基于顶点集合的视图

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"
  ...