Skip to main content

In my Aggregator transformer that I use to prepare and build a SQL query to next feed into SQLExecuter query, I want first to check if the primary key values are of type string in order to pad single quote for each value..

 (example: 

value1, value2, value3, ..for numeric primary keys

'value1','value2','value3', ..for string primary keys

)

So I chose to create a Scripted (Python) private parameter to check whether the primary key values of type string, then return a single quote as below: 

snglq= ","
# Check if the primary key is string?
if type(FME_MacroValuesn'SDE_PK']) == str:
    #then add a single quote
    snglq= "','"
else:
    # no single quote
    snglq= ","

return snglq

And then assign value returned to the Separator Character box in Aggregator transformer, as shown below:

0684Q00000ArAqFQAV.png

But that's not working properly, always result in values with padded single quote, yet the primary key values are of type numeric!!

What would be wrong here, please help

Hi @sami_snunu, there are some points to be considered.

  • Any user parameter value always is a string, even though it represents a number.

  • Value of the "Attributes to Concatenate" parameter in the Aggregator should be attribute name(s), won't be attribute value(s).

  • The script in a scripted parameter will be executed just once before translation starting, then its value is fixed.

For example, if the name of primary key attribute is one of "PK_N" (numeric type primary key attribute name) and "PK_S" (string type primary key attribute name), and the user parameter "SDE_PK" linked to the "Attributes to Concatenate" parameter in the Aggregator is defined to select one of them, this scripted Python parameter could work as expected.

return "','" if FME_MacroValuese'SDE_PK'] == 'PK_S' else ","

However, with the method, you will have to add leading and trailing single quote to the concatenated values later, if the primary key was string type. It's troublesome, so I think it's better that you surround individual values by single quote beforehand if selected primary key was string type and then concatenate the values with a comma as separator.

In addition, some database system allows you to surround any value by single quote in SQL statements, regardless of the corresponding field data type definition. Check also this point.


Hi @sami_snunu, there are some points to be considered.

  • Any user parameter value always is a string, even though it represents a number.

  • Value of the "Attributes to Concatenate" parameter in the Aggregator should be attribute name(s), won't be attribute value(s).

  • The script in a scripted parameter will be executed just once before translation starting, then its value is fixed.

For example, if the name of primary key attribute is one of "PK_N" (numeric type primary key attribute name) and "PK_S" (string type primary key attribute name), and the user parameter "SDE_PK" linked to the "Attributes to Concatenate" parameter in the Aggregator is defined to select one of them, this scripted Python parameter could work as expected.

return "','" if FME_MacroValuese'SDE_PK'] == 'PK_S' else ","

However, with the method, you will have to add leading and trailing single quote to the concatenated values later, if the primary key was string type. It's troublesome, so I think it's better that you surround individual values by single quote beforehand if selected primary key was string type and then concatenate the values with a comma as separator.

In addition, some database system allows you to surround any value by single quote in SQL statements, regardless of the corresponding field data type definition. Check also this point.

Thanks a lot @takashi for your answer.

You're right, I experimented all the catches you mentioned, especially the first one, scripted parameters are evaluated once, and would return in String, I noticed also the Separator Character can only accepts a parameter, not an attribute.

As you indicated, the solution could be simple, and definitely, Oracle's SQL statement can accept the single quote surrounding the values regardless whether the values are String or Numeric, so I set that manually as shown below:

0684Q00000ArMOKQA3.png

And then in the SQL Statement for the next transformer- SQLExecuter, would look like the below:

SELECT
    $(SDE_PK) as PRIMARY_KEY
FROM
    $(SDE_FEATURE_CLASS)
WHERE
   $(SDE_PK) IN
    (
     '@Value($(SDE_PK))'   #<--------
    )

This worked successfully now.

Many thanks again!


Reply