Paraméterjelölők

A paraméterjelölők nevesített vagy névtelen típusú helyőrző változók, amelyek az SQL-utasítást megváltó API értékeinek megadására szolgálnak.

A paraméterjelölők használata megvédi a kódot az SQL-injektálási támadásoktól, mivel egyértelműen elválasztja a megadott értékeket az SQL-utasításoktól.

Az elnevezett és a névtelen paraméterjelölők nem keverhetők ugyanabban az SQL-utasításban.

Nem hivatkozhat paraméterjelölőre egy DDL-utasításban, például generált oszlopra vagy DEFAULT definícióra, nézetre vagy SQL-függvényre.

Kivételek a záradék paraméterjelölőire IDENTIFIER mutató hivatkozások, amelyek felhasználhatók tábla- vagy oszlopnevek paraméterezésére bizonyos DDL-utasításokban. Lásd: IDENTIFIER záradék.

A paraméterjelölők a következőkkel adhatók meg:

Elnevezett paraméterjelölők

A következőkre vonatkozik: Databricks Runtime check marked yes 12.1 vagy újabb

Az elnevezett paraméterjelölők beírt helyőrző változók. Az SQL-utasítást invesztő API-nak név-érték párokat kell megadnia az egyes paraméterjelölők értékhez való társításához.

Szintaxis

 :parameter_name

Paraméterek

  • named_parameter_name

    Hivatkozás egy megadott paraméterjelölőre egy nem minősített azonosító formájában.

Jegyzetek

Ugyanarra a paraméterjelölőre többször is hivatkozhat ugyanabban az SQL-utasításban. Ha nincs érték a paraméterjelölőhöz kötve, UNBOUND_SQL_PARAMETER hiba jelenik meg. Nem szükséges az összes megadott paraméterjelölőre hivatkoznia.

A kötelező előző : (kettőspont) megkülönbözteti az elnevezett paraméterjelölők névterét az oszlopnevektől és az SQL-paraméterektől.

Példák

Az alábbi példa két paraméterjelölőt határoz meg:

  • később: INTERVAL HOUR 3 értékkel rendelkező.
  • x: A DOUBLE 15,0 értékkel

x többször hivatkozik rá, míg later egyszer hivatkozik rá.

SQL

> DECLARE stmtStr = 'SELECT current_timestamp() + :later, :x * :x AS square';
> EXECUTE IMMEDIATE stmtStr USING INTERVAL '3' HOURS AS later, 15.0 AS x;
  2024-01-19 16:17:16.692303  225.00

Scala

import org.apache.spark.sql.SparkSession

val spark = SparkSession
  .builder()
  .appName("Spark named parameter marker example")
  .getOrCreate()

val argMap = Map("later" -> java.time.Duration.ofHours(3), "x" -> 15.0)
spark.sql(
  sqlText = "SELECT current_timestamp() + :later, :x * :x AS square",
  args = argMap).show()
// +----------------------------------------+------+
// |current_timestamp() + INTERVAL '03' HOUR|square|
// +----------------------------------------+------+
// |                    2023-02-27 17:48:...|225.00|
// +----------------------------------------+------+

Java

import org.apache.spark.sql.*;
import static java.util.Map.entry;

SparkSession spark = SparkSession
  .builder()
  .appName("Java Spark named parameter marker example")
  .getOrCreate();

Map<String, String> argMap = Map.ofEntries(
  entry("later", java.time.Duration.ofHours(3)),
  entry("x", 15.0)
);

spark.sql(
  sqlText = "SELECT current_timestamp() + :later, :x * :x AS square",
  args = argMap).show();
// +----------------------------------------+------+
// |current_timestamp() + INTERVAL '03' HOUR|square|
// +----------------------------------------+------+
// |                    2023-02-27 17:48:...|225.00|
// +----------------------------------------+------+

Python

spark.sql("SELECT :x * :y * :z AS volume", args = { "x" : 3, "y" : 4, "z"  : 5 }).show()
// +------+
// |volume|
// +------+
// |    60|
// +------+

Névtelen paraméterjelölők

A következőkre vonatkozik: Databricks Runtime check marked yes 13.3 vagy újabb

A névtelen paraméterjelölők beírt helyőrző változók. Az SQL-utasítást invesztő API-nak egy argumentumtömböt kell megadnia, hogy az egyes paraméterjelölők egy értékkel legyenek társítva a megjelenésük sorrendjében.

Szintaxis

 ?

Paraméterek

  • ?: Hivatkozás egy megadott paraméterjelölőre kérdőjel formájában.

Jegyzetek

A névtelen paraméterjelölők minden előfordulása az SQL-utasítást invokáló API által biztosított értéket használja fel sorrendben. Ha nincs érték a paraméterjelölőhöz kötve, UNBOUND_SQL_PARAMETER hiba jelenik meg. Nem kell minden megadott értéket felhasználnia.

Példák

Az alábbi példa három paraméterjelölőt határoz meg:

  • INTERVAL HOUR 3 értékkel rendelkező.
  • Kettő DOUBLE 15,0 értékkel.

Mivel a paraméterek névtelenek, az egyes megadott értékeket legfeljebb egy paraméter használja.

SQL

> DECLARE stmtStr = 'SELECT current_timestamp() + ?, ? * ? AS square';
> EXECUTE IMMEDIATE stmtStr USING INTERVAL '3' HOURS, 15.0, 15.0;
  2024-01-19 16:17:16.692303  225.00

Scala

import org.apache.spark.sql.SparkSession

val spark = SparkSession
  .builder()
  .appName("Spark unnamed parameter marker example")
  .getOrCreate()

val argArr = Array(java.time.Duration.ofHours(3), 15.0, 15.0)

spark.sql(
  sqlText = "SELECT current_timestamp() + ?, ? * ? AS square", args = argArr).show()
// +----------------------------------------+------+
// |current_timestamp() + INTERVAL '03' HOUR|square|
// +----------------------------------------+------+
// |                    2023-02-27 17:48:...|225.00|
// +----------------------------------------+------+

Java

import org.apache.spark.sql.*;

SparkSession spark = SparkSession
  .builder()
  .appName("Java Spark unnamed parameter marker example")
  .getOrCreate();

Object[] argArr = new Object[] { java.time.Duration.ofHours(3), 15.0, 15.0 }

spark.sql(
  sqlText = "SELECT current_timestamp() + ?, ? * ? AS square",
  args = argArr).show();
// +----------------------------------------+------+
// |current_timestamp() + INTERVAL '03' HOUR|square|
// +----------------------------------------+------+
// |                    2023-02-27 17:48:...|225.00|
// +----------------------------------------+------+

Python

spark.sql("SELECT ? * ? * ? AS volume", args = { 3, 4, 5 }).show()
// +------+
// |volume|
// +------+
// |    60|
// +------+