基于apex集合的视图

时间:2015-05-01 10:12:08

标签: oracle oracle-apex

在我的应用程序中,我有一个基于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";

你能告诉我如何处理这类问题吗?是否可以使用此视图强制执行编译,以便在运行时它可以正常?或者也许没有办法编译这个包?

2 个答案:

答案 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封顶。提供菜肴。 {客户满意吗?}