当我们尝试在函数内创建视图时,我们得到错误:没有参数$ 1。这是示例代码。
Begin
CREATE VIEW artikelnr AS
SELECT datum, 'uitgifte' as "type", CASE WHEN 'test'='test' THEN 0 END as "aantal ontvangen", aantal as "aantal uitgegeven"
FROM uitgifteregel
JOIN artikel ON artikel.artikelnr = new.artikelnr
JOIN uitgifte ON uitgifte.uitgiftenr = uitgifteregel.uitgiftenr
UNION
SELECT datum, 'ontvangst' as "type", aantal as "aantal ontvangen" , CASE WHEN 'test'='test' THEN 0 END as "aantal uitgegeven"
FROM ontvangstregel
JOIN artikel ON artikel.artikelnr = new.artikelnr
JOIN ontvangst ON ontvangst.ontvangstnr = ontvangstregel.ontvangstnr;
Return new;
end;
当我们在第7行用值1替换new.artikelnr时,它的工作方式应该如此,但该函数需要使用不同的artikelnr。
示例第7行:JOIN artikel ON artikel.artikelnr = new.artikelnr
请指出正确的方向。
回复:我们必须为教育目的创建此视图。我上传了一张图片 我们数据库的视图和表结构:
http://img208.imageshack.us/img208/5655/tablesk.jpg
我们的第一个目标是创造 一个artikel的视图。我们通过以下代码实现了这一目标:
CREATE VIEW artikelmutatiestotaal AS
SELECT null as "datum",'totaal' as "type",sum(ontvangstregel.aantal)as "aantal ontvangen",sum(uitgifteregel.aantal) as "aantal uitgegeven"
FROM uitgifteregel, ontvangstregel
UNION
SELECT datum,'uitgifte' as "type", CASE WHEN 'test'='test' THEN 0 END as "aantal ontvangen", aantal as "aantal uitgegeven"
FROM uitgifteregel
JOIN artikel ON artikel.artikelnr = 1
JOIN uitgifte ON uitgifte.uitgiftenr = uitgifteregel.uitgiftenr
UNION
SELECT datum,'ontvangst' as "type", aantal as "aantal ontvangen" , CASE WHEN 'test'='test' THEN 0 END as "aantal uitgegeven"
FROM ontvangstregel
JOIN artikel ON artikel.artikelnr = 1
JOIN ontvangst ON ontvangst.ontvangstnr = ontvangstregel.ontvangstnr
我们唯一无法实现的是从插入语句中获取artikelnr的值。
CREATE FUNCTION addview() returns trigger as '
Begin
CREATE VIEW artikelnr AS
SELECT null as "datum",'totaal' as "type",sum(ontvangstregel.aantal)as "aantal ontvangen",sum(uitgifteregel.aantal) as "aantal uitgegeven"
FROM uitgifteregel, ontvangstregel
UNION
SELECT datum,'uitgifte' as "type", CASE WHEN 'test'='test' THEN 0 END as "aantal ontvangen", aantal as "aantal uitgegeven"
FROM uitgifteregel
JOIN artikel ON artikel.artikelnr = new.artikelnr
JOIN uitgifte ON uitgifte.uitgiftenr = uitgifteregel.uitgiftenr
UNION
SELECT datum,'ontvangst' as "type", aantal as "aantal ontvangen" , CASE WHEN 'test'='test' THEN 0 END as "aantal uitgegeven"
FROM ontvangstregel
JOIN artikel ON artikel.artikelnr = artikelnr
JOIN ontvangst ON ontvangst.ontvangstnr = ontvangstregel.ontvangstnr
end;
'language plpgsql;
当我们替换JOIN artikel ON artikel.artikelnr = new.artikelnr
时
在第7行与
JOIN artikel ON artikel.artikelnr = 1
它工作正常。很抱歉发布我的问题非常非结构化。我不太清楚哪些信息对回答这个问题很重要。
答案 0 :(得分:0)
这是什么数据库?
这个new
关键字是什么?这些代码是从某个触发器复制的吗?
new
替换为JOIN
子句中的正确表名。 Return new;
如果我没记错的话,当你拼错字段名时,MsAccess会报告类似的错误 接下来要检查所有字段名称。或者,使用一些可视化查询构建器并创建这些联合查询,以确保所有字段名称都正确。
我认为你可以放弃那些CASE语句并只写0 AS "Some Fieldname"
试试这个。它应该工作。 (我没有针对数据库进行测试)
CREATE OR REPLACE VIEW artikelnr AS
SELECT datum, 'uitgifte' as "type", 0 as "aantal ontvangen",
aantal as "aantal uitgegeven"
FROM uitgifteregel
JOIN artikel ON artikel.artikelnr = uitgifteregel.artikelnr
JOIN uitgifte ON uitgifte.uitgiftenr = uitgifteregel.uitgiftenr
UNION
SELECT datum, 'ontvangst' as "type", aantal as "aantal ontvangen" ,
0 as "aantal uitgegeven"
FROM ontvangstregel
JOIN artikel ON artikel.artikelnr = ontvangstregel.artikelnr
JOIN ontvangst ON ontvangst.ontvangstnr = ontvangstregel.ontvangstnr;
修改强>
我对Postgresql了解不多,但您可能应该查看EXECUTE SCRIPT
- 发送artikelnr
作为参数,然后在脚本中为视图构建DDL。
根据我对其他数据库(Oracle和SQL服务器)的经验,我认为你不应该为每条记录创建一个视图。你想用这种方法完成什么?
如果目标是预编译视图和此增益执行速度,则可以使用参数化查询实现相同的目标。将其放入存储过程并发送artikelnr
作为参数。
如果不是因为表现原因,请你解释一下你为什么要这样做。
编辑2:
回答:你无法以这种方式创建视图。问题是CREATE VIEW
在不替换值的情况下接受语句 - 它尝试使用new.artikelnr
创建视图,然后失败,因为您没有触发器之外的表new
。您需要将语句构造为字符串或文件,然后执行该语句。我检查了PostgreSQL的文档,并且有EXECUTE
命令用于构造和执行动态命令。这样的事情应该可行:
EXECUTE
'CREATE OR REPLACE VIEW artikelnr AS '
|| ' SELECT datum, 'uitgifte' as "type", 0 as "aantal ontvangen",'
|| ' aantal as "aantal uitgegeven" '
|| ' FROM uitgifteregel '
|| ' JOIN artikel ON artikel.artikelnr = '
|| new.artikelnr
|| ' JOIN uitgifte ON uitgifte.uitgiftenr = uitgifteregel.uitgiftenr '
|| ' UNION '
|| ' SELECT datum, 'ontvangst' as "type", aantal as "aantal ontvangen" , '
|| ' 0 as "aantal uitgegeven" '
|| ' FROM ontvangstregel '
|| ' JOIN artikel ON artikel.artikelnr = '
|| new.artikelnr
|| ' JOIN ontvangst ON ontvangst.ontvangstnr = ontvangstregel.ontvangstnr; '
这是一个在正确位置插入new.artikelnr
值的巨型concat。它将artikelnr
的文字值“插入”到SQL代码中,然后获得通过EXECUTE
语句执行的SQL。
请注意,上面的代码没有注意引用,它肯定不会按原样运行(因为这个例子是出于教育目的,所以留给读者纠正它作为练习:)。
在documentation for EXECUTE
statement中,您将找到使用引用函数的示例,这些函数应该用于正确构造上述命令。