oraclepl/SQL:请参阅替换bind变量后立即执行SQL

oraclepl/SQL:请参阅替换bind变量后立即执行SQL,oracle,plsql,Oracle,Plsql,这是PL/SQL代码。我希望DBMS在执行时输出完整的查询,因为它失败了 vSql := 'SELECT :p_nomeCampo FROM :vTable WHERE :vPkColumn = :p_id'; EXECUTE IMMEDIATE vSql INTO vOutput USING p_nomeCampo, vTable, vPkColumn, p_id; 没有直接回答这个问题,但它可能会失败,因为您只能绑定变量值,而不能绑定对象名称;所以只有:p_id在这里是有效的。您可能能做的

这是PL/SQL代码。我希望DBMS在执行时输出完整的查询,因为它失败了

vSql := 'SELECT :p_nomeCampo FROM :vTable WHERE :vPkColumn = :p_id';
EXECUTE IMMEDIATE vSql INTO vOutput USING p_nomeCampo, vTable, vPkColumn, p_id;

没有直接回答这个问题,但它可能会失败,因为您只能绑定变量值,而不能绑定对象名称;所以只有:p_id在这里是有效的。您可能能做的最好的事情是:

vSql := 'SELECT ' || p_nomeCampo || ' FROM ' || vTable
    || ' WHERE ' || vPkColumn || ' = :p_id';
当然,您需要确保p_nomeCampo、vTable和vPkColumn的值不受SQL注入的影响


它有助于显示您所遇到的错误,不过在本例中,这并不是问题的重点…

没有直接回答问题,但它可能会失败,因为您只能绑定变量值,而不能绑定对象名称;所以只有:p_id在这里是有效的。您可能能做的最好的事情是:

vSql := 'SELECT ' || p_nomeCampo || ' FROM ' || vTable
    || ' WHERE ' || vPkColumn || ' = :p_id';
当然,您需要确保p_nomeCampo、vTable和vPkColumn的值不受SQL注入的影响


它有助于显示您所遇到的错误,但在本例中,这并不是问题的直接重点…

p\u nomeCampo、vTable和vPkColumn仅当所有值都来自软件本身而不是用户界面时才容易受到SQL注入的影响。是的,它们来自上一个查询。没有用户界面。在理解你指的是查询中的对象名称之前,我已经阅读了很多次答案!p_nomeCampo、vTable和vPkColumn仅当所有值都来自软件本身而不是来自用户界面时才易受SQL注入的影响。是的,它们来自上一个查询。没有用户界面。在理解你指的是查询中的对象名称之前,我已经阅读了很多次答案!