我正在尝试使用名为START_TIME和END_TIME的列在oracle应用程序构建器中创建一个表单。
现在,当我尝试查看表单时,我只能将其视为日期,不能输入任何HOURS或MINUTES。
我的表格构建如下:
CREATE TABLE "MACHINE_SCHEDULE"
( "SCHEDULE_NUMBER" VARCHAR2(100 CHAR),
"MACHINE_NO" VARCHAR2(10 CHAR),
"MACHINE_USE_DATE" DATE,
"START_TIME" DATE,
"END_TIME" DATE,
"PROCESS" VARCHAR2(164 CHAR),
"BATCH_NO" VARCHAR2(10 CHAR),
"MATERIAL_BAR_NO" NUMBER(8,0),
"TECHNICIAN_STAFF_NO" VARCHAR2(15 CHAR),
CONSTRAINT "MACHINE_SCHEDULE_PK" PRIMARY KEY ("SCHEDULE_NUMBER") ENABLE
)
/
ALTER TABLE "MACHINE_SCHEDULE" ADD CONSTRAINT "MACHINE_SCHEDULE_CON" FOREIGN KEY ("TECHNICIAN_STAFF_NO")
REFERENCES "MODULE_TECHNICIAN" ("TECHNICIAN_STAFF_NO") ENABLE
/
ALTER TABLE "MACHINE_SCHEDULE" ADD CONSTRAINT "MACHINE_SCHEDULE_FK" FOREIGN KEY ("BATCH_NO")
REFERENCES "BATCH" ("BATCH_NO") ENABLE
/
ALTER TABLE "MACHINE_SCHEDULE" ADD CONSTRAINT "MACHINE_SCHEDULE_FK2" FOREIGN KEY ("MATERIAL_BAR_NO")
REFERENCES "MATERIAL_BAR" ("MATERIAL_BAR_NO") ENABLE
/
CREATE OR REPLACE TRIGGER "BI_MACHINE_SCHEDULE"
before insert on "MACHINE_SCHEDULE"
for each row
begin
if :NEW."SCHEDULE_INSTANT_NUMBER" is null then
select "MACHINE_SCHEDULE_SEQ".nextval into :NEW."SCHEDULE_INSTANT_NUMBER" from dual;
end if;
end;
/
ALTER TRIGGER "BI_MACHINE_SCHEDULE" DISABLE
/
我无法修改DATE
我的表单使用以下来源:
select
"SCHEDULE_NUMBER",
"SCHEDULE_NUMBER" SCHEDULE_NUMBER_DISPLAY,
"MACHINE_NO",
"MACHINE_USE_DATE",
"START_TIME" as b,
TO_CHAR(b, 'HH24:MI:SS'),
"END_TIME",
"PROCESS",
"BATCH_NO",
"MATERIAL_BAR_NO",
"TECHNICIAN_STAFF_NO"
from "#OWNER#"."MACHINE_SCHEDULE"
然而它给了erorr:
“无法在Builder中解析查询。如果您相信自己的查询 在语法上是正确的,请检查下面的“通用列”复选框 区域源在不解析的情况下继续进行。 ORA-00904:“B”:无效 标识符“
如果我将'b'变量更改为START_TIME,则会出现错误:
查询列#5(TO_CHAR(“START_TIME”,'HH24:MI:SS'))无效,请使用 列别名
答案 0 :(得分:1)
当我们在select语句中使用表达式时,Oracle使用表达式派生标识符,因为投影中的每个列必须具有唯一的名称。检查SQL * Plus中的列标题以查看此操作。
但是有些客户端不喜欢这些派生标识符,并希望获得符合Oracle命名约定的好名称。看来,Forms Builder就是这样一个工具。
这样的错误信息,
query column #5 (TO_CHAR("START_TIME",'HH24:MI:SS')) is invalid, use column alias
告诉你给表达式一个别名,即
"START_TIME" ,
TO_CHAR("START_TIME", 'HH24:MI:SS') as b,
只有我建议您使用更有意义的内容,例如START_TIME_FMT。
我无法在新列中输入任何细节。它显示为“NULL”
我认为这种行为是因为它是派生字段。因此,您需要做的是从查询中删除它并使用非表项。当您从数据库中检索记录时,使用格式化的START_TIME填充它,并在插入或更新后使用触发器将其值复制到(隐藏的)START_TIME列。
答案 1 :(得分:0)
另外:
-- This will never work --
SELECT SYSDATE as b, to_char(b, 'HH24:MI:SS') tme
FROM dual
/
Output: ORA-00904: "B": invalid identifier
-- This will work --
SELECT to_char(b, 'HH24:MI:SS') tme
FROM
(
SELECT SYSDATE as b
FROM dual
)
/
Output: 10:09:02
答案 2 :(得分:0)
围绕TO_CHAR中字段的双引号会导致问题。事实上,你不需要任何一个。 APEX中的查询构建器对双引号有点生气!
试试这个:
select
SCHEDULE_NUMBER,
SCHEDULE_NUMBER SCHEDULE_NUMBER_DISPLAY,
MACHINE_NO,
MACHINE_USE_DATE,
START_TIME as b,
TO_CHAR(START_TIME,'HH24:MI:SS'),
END_TIME,
PROCESS,
BATCH_NO,
MATERIAL_BAR_NO,
TECHNICIAN_STAFF_NO
from #OWNER#.MACHINE_SCHEDULE