这是我的触发器:
CREATE OR REPLACE FUNCTION update_played ()
RETURNS trigger
AS
$BODY$
DECLARE
v_count_played integer;
BEGIN
SELECT count(*) INTO STRICT v_count_played FROM history WHERE song_id = NEW.song_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE EXCEPTION 'history count for song % not found', NEW.song_id;
WHEN TOO_MANY_ROWS THEN
RAISE EXCEPTION 'history count did not aggregate';
EXECUTE 'UPDATE song SET count_played = $1 WHERE id = $2'
USING v_count_played, NEW.song_id;
RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
create trigger update_played_trigger
after insert on history
for each row
execute procedure update_played();
它给出错误:
sqlalchemy.exc.InternalError:(psycopg2.InternalError)控件在没有RETURN的情况下达到了触发程序的结束
答案 0 :(得分:1)
您误解了EXCEPTION
关键字。如果我改变你的缩进以匹配它的工作方式,它可能会帮助你理解。 EXCEPTION
与BEGIN
和END
一起显示try {} catch {}
,就像其他语言中的BEGIN
SELECT count(*) INTO STRICT v_count_played
FROM history WHERE song_id = NEW.song_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE EXCEPTION 'history count for song % not found', NEW.song_id;
WHEN TOO_MANY_ROWS THEN
RAISE EXCEPTION 'history count did not aggregate';
EXECUTE 'UPDATE song SET count_played = $1 WHERE id = $2'
USING v_count_played, NEW.song_id;
RETURN NULL;
END;
一样。所以它的工作原理如下:
SELECT
这里发生的是你运行NO_DATA_FOUND
。如果RAISE
例外,您TOO_MANY_ROWS
。如果您RAISE
存在RAISE EXCEPTION
例外,那么在EXECUTE
执行RETURN
的{{1}}之后,同一块中会出现无法访问的代码和SELECT
。
如果BEGIN
BEGIN
SELECT count(*) INTO STRICT v_count_played FROM history WHERE song_id = NEW.song_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE EXCEPTION 'history count for song % not found', NEW.song_id;
WHEN TOO_MANY_ROWS THEN
RAISE EXCEPTION 'history count did not aggregate';
END;
EXECUTE 'UPDATE song SET count_played = $1 WHERE id = $2'
USING v_count_played, NEW.song_id;
RETURN NULL;
END;
没有例外,则不再采取进一步行动,程序只退出,不返回任何内容。
我认为你打算写的是:
add_action( 'admin_enqueue_scripts','your_script' );
function your_script() {
wp_enqueue_style( 'style_register', plugins_url( '/css/style.css', __FILE__ ) );
wp_enqueue_script( 'script_register', plugins_url( '/js/admin.js', __FILE__ ) );
}
<input id="the_field" name="the_field" value="your_value" type="text"/>
<input id="meta_update" name="meta_update" class="button updatemeta button-small" value="Update"/>
<?php $html .= '<span id="ajax_meta_nonce" class="hidden">' . wp_create_nonce( 'ajax_meta_nonce' ) . '</span>'; echo $html; ?>
<span class="ajax_response_span"></span>